Quelle est la différence entre VARCHAR et CHAR?

366

Quelle est la différence entre VARCHAR et CHAR dans MySQL?

J'essaie de stocker les hachages MD5.

Steven
la source
15
Le hachage MD5 comporte toujours 32 caractères. Par conséquent, pour maximiser vos performances, utilisez CHAR (32) car CHAR est de longueur fixe (voir les réponses ci-dessous pour plus de détails sur les différences entre CHAR et VARCHAR).
Augustin

Réponses:

361

VARCHAR est de longueur variable.

CHAR est de longueur fixe.

Si votre contenu est de taille fixe, vous obtiendrez de meilleures performances avec CHAR.

Voir la page MySQL sur les types CHAR et VARCHAR pour une explication détaillée (assurez-vous de lire également les commentaires).

Anon.
la source
51
@steven: quand Anon. dit "votre contenu est de taille fixe" cela signifie que les lignes de votre table doivent contenir tous les champs de taille fixe. Vous n'obtenez aucune amélioration des performances si vous utilisez CHAR contre VARCHAR dans un champ, mais la table contient d'autres champs qui sont VARCHAR.
Marco Demaio
2
aucun type de données char n'améliore les performances ... lors de l'exécution de la requête SQL générera un plan d'exécution. Supposons qu'il existe 2 colonnes charcol char (2000) et VarcharCol Varchar (2000). Dans le plan d'exécution, la taille estimée des lignes pour le type de colonnes varchar peut être sous-estimée. il entraîne donc le déversement à temp db. Donc, utiliser char est bon pour la performance
vignesh
1
quelle est la signification de la valeur entre parenthèses de VARCHAR (n)?
Sivagami Nambi
@Marco Demaio connaissez-vous la raison derrière cela?
Dehan de Croos
1
@ jdc91: pour augmenter les performances, toute la ligne doit être de largeur fixe. MySQL gagne en avantage à calculer l'espace requis et le décalage des lignes dans ce type de table.
Marco Demaio
225

CARBONISER

  1. Utilisé pour stocker une valeur de chaîne de caractères de longueur fixe .
  2. Le nombre maximum. de caractères que le type de données peut contenir est de 255 caractères .
  3. C'est 50% plus rapide que VARCHAR.
  4. Utilise l'allocation de mémoire statique .

VARCHAR

  1. Utilisé pour stocker des données alphanumériques de longueur variable .
  2. Le maximum que ce type de données peut contenir est jusqu'à
    • Pré-MySQL 5.0.3: 255 caractères .
    • Post-MySQL 5.0.3: 65 535 caractères partagés pour la ligne.
  3. C'est plus lent que CHAR.
  4. Utilise l'allocation dynamique de mémoire .
simplePerson43
la source
3
Je suis légèrement surpris que cette réponse ait été votée si souvent. La documentation MySQL déclareValues in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS
2
sans oublier que vous pouvez également stocker des données alphanumériques dans char
ninjabber
44
Sur quoi est basé 50% plus vite? 50% plus rapide pour faire quoi? Dans quelles conditions? Et qu'entendez-vous par allocation statique de mémoire vs dynamique dans ce contexte?
Martin Smith
4
@MartinSmith J'allais demander la même chose. Je ne pense pas que les informations soient exactes. asktom.oracle.com/pls/asktom/…
Ozgur Bar
2
-1; les affirmations de performances ici sont vagues et non étayées, la différence dans la stratégie d'allocation de mémoire (et pourquoi elle importe) n'est pas étoffée, et l'affirmation selon laquelle varchar stocke les "données alphanumériques" est un peu étrange; Les colonnes varchar peuvent également stocker des caractères non alphanumériques!
Mark Amery
122

CHAR contre VARCHAR

CHAR est utilisé pour la variable de taille de longueur fixe
VARCHAR est utilisé pour la variable de taille de longueur variable.

Par exemple

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

La sortie sera

length(City)          Length(street)
10                    6

Conclusion: Pour utiliser efficacement l'espace de stockage, vous devez utiliser VARCHAR à la place CHAR si la longueur variable est variable

P Sharma
la source
4
Ville = char (10), Rue = varchar (10), ville = Pune, rue = Oxford, longueur (ville) = 4, longueur (rue) = 6
abdulwadood
2
cette requête (sélectionner la longueur (ville), la longueur (rue) à partir de temp) donne la sortie suivante dans mysql 5.7 mysql> sélectionner la longueur (ville), la longueur (rue) à partir de temp; + -------------- + ---------------- + | longueur (ville) | longueur (rue) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 ligne dans l'ensemble (0,00 sec)
Jasbeer Rawal
69

Une CHAR(x)colonne ne peut avoir exactement que des x caractères.
Une VARCHAR(x)colonne peut contenir jusqu'à x caractères.

Étant donné que vos hachages MD5 auront toujours la même taille, vous devriez probablement utiliser un CHAR .

Cependant, vous ne devriez pas utiliser MD5 en premier lieu; il a connu des faiblesses.
Utilisez plutôt SHA2.
Si vous hachez des mots de passe, vous devez utiliser bcrypt.

SLaks
la source
44
Msgstr "Une colonne CHAR (x) ne peut contenir que x caractères exactement.". En fait, vous pouvez ajouter des données avec moins de x caractères, mais je pense que vous vouliez dire que cela RÉSERVE toujours 10 caractères de mémoire dans les coulisses.
Dan W
13
Vous ne savez pas pourquoi ils stockent des hachages md5, il existe de nombreuses raisons valables d'utiliser md5 qui n'ont rien à voir avec la sécurité. Les collisions ne sont pas courantes du tout et l'algorithme est plus rapide que les plus sécurisés.
John Hunt
1
En supposant que la colonne CHAR (x) n'applique pas exactement les caractères x, y a-t-il une raison de l'utiliser sur VARCHAR (x) même pour des données de taille fixe?
NeverEndingQueue
11

Quelle est la différence entre VARCHAR et CHAR dans MySQL?

Aux réponses déjà données, je voudrais ajouter que dans les systèmes OLTP ou dans les systèmes avec des mises à jour fréquentes, envisagez d'utiliser CHARmême pour les colonnes de taille variable en raison de la VARCHARfragmentation possible des colonnes lors des mises à jour.

J'essaie de stocker les hachages MD5.

Le hachage MD5 n'est pas le meilleur choix si la sécurité est vraiment importante. Cependant, si vous utilisez une fonction de hachage, envisagez BINARYplutôt le type (par exemple, MD5 produira un hachage de 16 octets, donc ce BINARY(16)serait suffisant au lieu de CHAR(32)32 caractères représentant des chiffres hexadécimaux. Cela économiserait plus d'espace et serait efficace en termes de performances.

Grygoriy Gonchar
la source
Suite à cette réflexion, j'utiliserais CHAR pour les identifiants d'entreprise qui sont destinés à la lisibilité par rapport à l'efficacité. J'utiliserais quand même des clés primaires bigint.
Archimedes Trajano
9

Varchar coupe les espaces de fin si les caractères saisis sont plus courts que la longueur déclarée, contrairement à char. Le caractère remplira les espaces et sera toujours la longueur de la longueur déclarée. En termes d'efficacité, varchar est plus habile car il coupe les caractères pour permettre plus d'ajustement. Cependant, si vous connaissez la longueur exacte de char, char s'exécutera avec un peu plus de vitesse.

user1445657
la source
7

Aujourd'hui, dans la plupart des SGBDR, ce sont des synonymes. Cependant, pour les systèmes qui ont encore une distinction, un champ CHAR est stocké sous la forme d'une colonne à largeur fixe. Si vous le définissez comme CHAR (10), 10 caractères sont écrits dans la table, où le "remplissage" (généralement des espaces) est utilisé pour remplir tout espace que les données n'utilisent pas. Par exemple, l'enregistrement de "bob" serait enregistré sous ("bob" +7 espaces). Une colonne VARCHAR (caractère variable) est destinée à stocker des données sans gaspiller l'espace supplémentaire qu'une colonne CHAR fait.

Comme toujours, Wikipedia parle plus fort.

mobiGeek
la source
5

CHAR est un champ de longueur fixe; VARCHAR est un champ de longueur variable. Si vous stockez des chaînes avec une longueur extrêmement variable telle que des noms, utilisez un VARCHAR, si la longueur est toujours la même, utilisez un CHAR car il est légèrement plus efficace en termes de taille et également légèrement plus rapide.

Andrew
la source
Bien que je suppose que les affirmations sur la vitesse et l'efficacité du stockage ici sont vraies, aucune d'entre elles n'est étayée d'aucune manière (et il est parfaitement plausible qu'elles soient fausses), ce qui rend cette réponse non utile; il répète simplement ce que le lecteur aurait probablement déjà pensé être vrai, sans rien faire pour vraiment aider à le confirmer.
Mark Amery
1

CHAR est de longueur fixe et VARCHAR est de longueur variable. CHAR utilise toujours la même quantité d'espace de stockage par entrée, tandis que VARCHAR utilise uniquement la quantité nécessaire pour stocker le texte réel.

Donnie DeBoer
la source
1

Le char est un type de données de caractères de longueur fixe, le varchar est un type de données de caractères de longueur variable.

Étant donné que char est un type de données de longueur fixe, la taille de stockage de la valeur char est égale à la taille maximale de cette colonne. Étant donné que varchar est un type de données de longueur variable, la taille de stockage de la valeur varchar est la longueur réelle des données entrées, pas la taille maximale pour cette colonne.

Vous pouvez utiliser char lorsque les entrées de données dans une colonne devraient avoir la même taille. Vous pouvez utiliser varchar lorsque les entrées de données dans une colonne devraient varier considérablement en taille.

Bob Minteer
la source
0

selon le livre MySQL haute performance :

VARCHAR stocke des chaînes de caractères de longueur variable et est le type de données de chaîne le plus courant. Il peut nécessiter moins d'espace de stockage que les types à longueur fixe, car il n'utilise que l'espace dont il a besoin (c'est-à-dire que moins d'espace est utilisé pour stocker des valeurs plus courtes). L'exception est une table MyISAM créée avec ROW_FORMAT = FIXED, qui utilise une quantité fixe d'espace sur le disque pour chaque ligne et peut donc gaspiller de l'espace. VARCHAR améliore les performances car il économise de l'espace.

CHAR est de longueur fixe: MySQL alloue toujours suffisamment d'espace pour le nombre de caractères spécifié. Lors du stockage d'une valeur CHAR, MySQL supprime tous les espaces de fin. (Cela était également vrai pour VARCHAR dans MySQL 4.1 et les versions antérieures — CHAR et VAR CHAR étaient logiquement identiques et ne différaient que dans le format de stockage.) Les valeurs sont remplies avec des espaces selon les besoins pour les comparaisons.

Alireza Rahmani Khalili
la source
2
" VARCHAR améliore les performances car il économise de l'espace " Oui, il économise de l'espace, mais cela n'affecte-t-il pas négativement les performances? VARCHARdoit allouer dynamiquement de la mémoire au fur et à mesure des besoins, réduisant ainsi les performances par opposition à CHAR, non?
Spikatrix du
@Spikatrix dépend. Si les valeurs VARCHAR sont souvent petites mais peuvent aller jusqu'à N octets, alors l'allocation dynamique peut économiser une quantité importante d'espace et d'E / S, ce qui est plus performant pour de nombreuses données. Des valeurs CHAR qui sont à peu près égales en longueur seraient plus performantes. La lecture et l'écriture font également une différence.
Andrew
-4

Char a une longueur fixe (prend en charge 2000 caractères), il représente le caractère est un type de données

Varchar a une longueur variable (prend en charge 4000 caractères)

Amandeep
la source
-1; ces chiffres ne sont pas corrects pour MySQL. (Je pense qu'ils pourraient être pour Oracle?)
Mark Amery
-5

Char ou varchar- il est utilisé pour saisir des données textuelles où la longueur peut être indiquée entre parenthèses. Eg- char (20)

Amy
la source
Cela ne répond pas à la question d'origine. OP demande les différences pratiques entre les types, pas la syntaxe et le but des types. Aussi (et )sont des parenthèses, pas des crochets.
2mac
@ 2mac, votre dernière phrase ne s'applique qu'à l'anglais américain; en Grande-Bretagne, nous appelons (et )crochets, et de nombreux Britanniques ne réalisent probablement même pas qu'il existe des dialectes anglais dans lesquels le mot "parenthèse" peut faire référence à un signe de ponctuation. Il y a de bonnes raisons de préférer les "parenthèses" aux "crochets" - c'est probablement, dans l'ensemble, l'option la plus claire possible pour cibler un public international de programmeurs - mais c'est un cas plus compliqué que les "crochets" se trompent.
Mark Amery
-11

CHAR:

  • Prend en charge les caractères et les nombres.
  • Prend en charge 2000 caractères.
  • Longueur fixe.

VARCHAR:

  • Prend en charge les caractères et les nombres.
  • Prend en charge 4000 caractères.
  • Longueur variable.

des commentaires ...... !!!!

YRSREDDY
la source