Char vs Varchar - SQL/NoSQL - Programmation
Marsh Posté le 12-06-2008 à 14:31:45
char <- caractère de bourrage (typiquement des espaces), taille fixe
varchar <- pas de bourrage, taille variable dans la limite fixée.
après selon ton SGBD, si'l est pourri ou pas, t'auras des mésaventures de trucs tantot bourré ou pas, quand ils ne le devraient pas ou si.
Marsh Posté le 12-06-2008 à 14:38:27
En cherchant sur le net j ai eu 2 avis contradictoires il y en a un qui dit que de toutes facons il y a un alogrithme de compression qui fait que la place sur le disque est la meme au final.
Source: http://www.volny.cz/iprenosil/inte [...] trings.htm
Et un autre me dit (mais en MySql) que le varchar ajoute 2 bytes et que donc les varchar devient vraiment intéressant à partir de 18 char
Source: http://archives.postgresql.org/pgs [...] g00520.php
Marsh Posté le 12-06-2008 à 14:43:33
et alors ? De toutes façons, ce sont deux types de données au comportement différents. Leur implémentation est complètement dépendante du SGBRD en dessous. Certains SGBD stocke de toutes façons tout ce qui est chaine dans des tables internes dédiés, sans gachi de place ni rien.
Optimisation prématurée, toussa. Choisi le type adéquat déjà. Pour le reste, regarde avec ton SGBDR s'il a des fonction pour mesurer précisément le poids d'une table remplie (le poids de chaque ligne est évidemment différent).
Marsh Posté le 12-06-2008 à 14:44:33
Le message initial sur http://archives.postgresql.org/pgs [...] g00520.php est parfait.
Marsh Posté le 12-06-2008 à 14:46:33
PS: même si nous racontes que c'est pour une base de données de la NASA en titane pour stocker des milliards de milliards de trucs, au prix que coute le To, ça ne fait aucune différence.
Marsh Posté le 12-06-2008 à 14:48:47
Non je m en fout un peu au final car j ai des petites DB s'était juste par curiosité!
Marsh Posté le 13-06-2008 à 09:54:45
et surtout le char c'est chiant, faut toujours trimer pour faire une comparaison, c'est juste pénible...
Marsh Posté le 16-06-2008 à 01:32:05
un char ça ne sert que pour stocker une valeur qui a toujours la même longueur, telle un code ou une date par exemple.
genre le code ISO d'un pays on sait que ça fait toujours 2 ou 3 lettres (selon la norme ISO retenue). à ce moment, un char est intéressant. pour le reste, varchar est le plus dédié aux chaînes de caractères, puisque c'est aussi comme ça que ton programme consommateur/fournisseur va gérer les données en mémoire : donc pas de trim/pad inutiles
Marsh Posté le 16-06-2008 à 08:54:36
ReplyMarsh Posté le 16-06-2008 à 09:08:17
ben si ton champs est de type char(10) et que tu veuilles trouver la valeur 'toto' soit tu fais un champ = 'toto ' soit un trim(champ)= 'toto' , donc a moi d'aimer les problèmes le trim est quasi indispensable
Marsh Posté le 16-06-2008 à 10:20:26
weed a écrit : euh, je ne pense pas qu'il faille pour autant trimer à chaque fois un char |
Si tu attends un nom de personne, alors si :
Code :
|
Retournera jamais rien si "nom" n'est pas un char(9)"
il faudra à la place utiliser (si nom = char(12))
Code :
|
ou
Code :
|
ou
Code :
|
(avec un résultat aléatoirement faut)
et surtout, la troncature est faite implicitement :
isocode = char(2)
Code :
|
Code :
|
=> Les deux requêtes retournent la ligne "FR" sans le moindre warning. alors qu'avec un varchar(2) aucune n'aurait retourné de valeur
idem pour l'insertion : inserrer une valeur trop grande dans un char tronque la valeur sans crier gare. avec un varchar tu te tapes une erreur (cf norme SQL)
Marsh Posté le 17-06-2008 à 11:24:50
oki oki MagicBuzz. Je remercie de m'avoir expliquer avec des exemples. C'est tres claire dans ma tete maintenant.
Je comprends maintenant pour on avait conseillé à mon collègue d'utiliser varchar2 tout le temps plutot que char.
char est en théorie légèrement plus performant mais n'est pas très pratique à l'usage.
Marsh Posté le 12-06-2008 à 14:27:03
Bonjour,
J'ai une question existentielle pour le choix entre char et varchar. Je sais que si on prend un char(3) par exemple il réserve d'office la place pour 3 caractères. Mais si je fait un varchar(3) je suppose qu'il doit avoir un endroit ou il stoque la taille donc au final mon varchar(3) ne prendra t il pas plus de place que mon char(3)? A partir de combien de caractères ca devient intéressant?
D'avance merci si vous avez des infos! Je suis en MsSql!
Benjamin