Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
6117 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Char vs Varchar

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Char vs Varchar

n°1745462
the big be​n
Posté le 12-06-2008 à 14:27:03  profilanswer
 

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

mood
Publicité
Posté le 12-06-2008 à 14:27:03  profilanswer
 

n°1745468
Taz
bisounours-codeur
Posté le 12-06-2008 à 14:31:45  profilanswer
 

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.

n°1745470
the big be​n
Posté le 12-06-2008 à 14:38:27  profilanswer
 

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

n°1745474
Taz
bisounours-codeur
Posté le 12-06-2008 à 14:43:33  profilanswer
 

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).

n°1745475
Taz
bisounours-codeur
Posté le 12-06-2008 à 14:44:33  profilanswer
 

Le message initial sur http://archives.postgresql.org/pgs [...] g00520.php est parfait.

n°1745476
Taz
bisounours-codeur
Posté le 12-06-2008 à 14:46:33  profilanswer
 

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.

n°1745479
the big be​n
Posté le 12-06-2008 à 14:48:47  profilanswer
 

Non je m en fout un peu au final car j ai des petites DB s'était juste par curiosité!

n°1745815
casimimir
Posté le 13-06-2008 à 09:54:45  profilanswer
 

et surtout le char c'est chiant, faut toujours trimer pour faire une comparaison, c'est juste pénible...

n°1746851
MagicBuzz
Posté le 16-06-2008 à 01:32:05  profilanswer
 

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

n°1746871
weed
Posté le 16-06-2008 à 08:54:36  profilanswer
 

euh, je ne pense pas qu'il faille pour autant trimer à chaque fois un char

mood
Publicité
Posté le 16-06-2008 à 08:54:36  profilanswer
 

n°1746874
casimimir
Posté le 16-06-2008 à 09:08:17  profilanswer
 

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


Message édité par casimimir le 16-06-2008 à 09:08:32
n°1746916
MagicBuzz
Posté le 16-06-2008 à 10:20:26  profilanswer
 

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 :
  1. SELECT * FROM gens WHERE nom = 'MagicBuzz'


 
Retournera jamais rien si "nom" n'est pas un char(9)"
 
il faudra à la place utiliser (si nom = char(12))
 

Code :
  1. SELECT * FROM gens WHERE nom = rpad('MagicBuzz', 12)


 
ou
 

Code :
  1. SELECT * FROM gens WHERE rtrim(nom) = 'MagicBuzz'


 
ou
 

Code :
  1. SELECT * FROM gens WHERE nom LIKE 'MagicBuzz%'

(avec un résultat aléatoirement faut)
 
et surtout, la troncature est faite implicitement :
 
isocode = char(2)
 

Code :
  1. SELECT * FROM pays WHERE isocode = 'FRA'


 

Code :
  1. SELECT * FROM pays WHERE isocode = 'FRI'


 
=> 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)


Message édité par MagicBuzz le 16-06-2008 à 10:21:47
n°1747431
weed
Posté le 17-06-2008 à 11:24:50  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Char vs Varchar

 

Sujets relatifs
Convertir un varchar en dateFonction avec parametre en char * et appel avec string
Plantage: strchr() avec un char **Problème de conversion string en const char *
[DB2] extraire un nombre packé d'un CHARVARCHAR vs CHAR : quelles différences de perfs?
[SQL] (noob) difference entre char et varchar[SQL SERVER] Primary key de type char/varchar
mySQL : CHAR ou VARCHARmysql, varchar ou char?
Plus de sujets relatifs à : Char vs Varchar


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)