425 votes

Quelle est la différence entre VARCHAR et CHAR ?

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

J'essaie de stocker des hachages MD5.

16 votes

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

0 votes

Documentation MySQL : Les types CHAR et VARCHAR

422voto

Anon. Points 26829

VARCHAR est de longueur variable.

CHAR est de longueur fixe.

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

Voir la page MySQL sur Types CHAR et VARCHAR pour une explication détaillée (n'oubliez pas de lire également les commentaires).

64 votes

@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 que la table contient d'autres champs qui sont VARCHAR.

2 votes

Aucun type de données char n'ajoute la performance ... pendant l'exécution de la requête sql va générer un plan d'exécution. Supposons qu'il y a 2 colonnes charcol char(2000) et VarcharCol Varchar(2000). dans le plan d'exécution, la taille de ligne estimée pour le type de colonnes varchar pourrait être sous-estimée. ainsi cela conduit au débordement vers la base de données temporaire. L'utilisation de char est donc bonne pour les performances.

1 votes

Quelle est la signification de la valeur en paranthèses de VARCHAR(n) ?

246voto

Rahul Bhadana Points 550

CHAR

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

VARCHAR

  1. Utilisé pour stocker longueur variable des données alphanumériques.
  2. Ce type de données peut contenir au maximum
    • Pré-MySQL 5.0.3 : 255 caractères .
    • Post-MySQL 5.0.3 : 65 535 caractères partagé pour le rang.
  3. C'est plus lent que CHAR.
  4. Utilisations allocation dynamique de la mémoire .

3 votes

Je suis un peu surpris que cette réponse ait été upvoted si souvent. La documentation MySQL indique Values 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.

3 votes

Sans oublier que vous pouvez également stocker des données alphanumériques dans les chars.

57 votes

Sur quoi est basée cette accélération de 50 % ? 50% plus rapide pour faire quoi ? Dans quelles conditions ? Et qu'entendez-vous par allocation de mémoire statique ou dynamique dans ce contexte ?

134voto

P Sharma Points 430

CHAR Vs VARCHAR

CHAR est utilisé pour les variables de taille fixe
VARCHAR est utilisé pour la variable de taille 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, il faut utiliser VARCHAR au lieu de CHAR si la longueur de la variable est variable.

4 votes

Ville = char(10), Rue = varchar(10), ville = Pune, rue = Oxford, longueur(ville) = 4, longueur(rue) = 6

4 votes

Cette requête (select length(city), length(street) from temp) donne le résultat suivant dans mysql 5.7 mysql> select length(city), length(street) from temp ; +--------------+----------------+ | length(city) | length(street) | +--------------+----------------+ | 4 | 6 | +--------------+----------------+ 1 row in set (0.00 sec)

85voto

SLaks Points 391154

A CHAR(x) ne peut avoir que exactement x des personnages.
A VARCHAR(x) La colonne peut avoir jusqu'à x des personnages.

Puisque vos hachages MD5 seront toujours de la même taille, vous devriez probablement utiliser un fichier CHAR .

Cependant, vous ne devriez pas utiliser MD5 en premier lieu ; il a des faiblesses connues.
Utilisez SHA2 à la place.
Si vous voulez hacher des mots de passe, vous devriez utiliser bcrypt.

49 votes

"Une colonne CHAR(x) ne peut comporter 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 qu'il RÉSERVE toujours 10 caractères de mémoire dans les coulisses.

16 votes

Vous ne savez pas pourquoi ils stockent les hachages md5, il y a beaucoup, beaucoup de raisons valables d'utiliser md5 qui n'ont rien à voir avec la sécurité. Les collisions ne sont pas du tout courantes et l'algorithme est plus rapide que les algorithmes plus sûrs.

2 votes

En supposant que la colonne CHAR(x) ne respecte pas exactement les caractères x, y a-t-il une raison de l'utiliser plutôt que VARCHAR(x), même pour des données de taille fixe ?

12voto

Grygoriy Gonchar Points 549

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

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

J'essaie de stocker des hachages MD5.

Le hachage MD5 n'est pas le meilleur choix si la sécurité est vraiment importante. Cependant, si vous utilisez n'importe quelle fonction de hachage, pensez à BINARY à la place (par exemple, MD5 produira un hachage de 16 octets, alors BINARY(16) serait suffisant au lieu de CHAR(32) pour 32 caractères représentant des chiffres hexadécimaux. Cela permettrait de gagner de l'espace et d'améliorer les performances.

0 votes

En suivant ce raisonnement, j'utiliserais le CHAR pour les identifiants professionnels, qui sont destinés à être plus lisibles qu'efficaces. Je continuerais cependant à utiliser des clés primaires bigint.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X