Quelle est la différence entre VARCHAR et CHAR dans MySQL ?
J'essaie de stocker des hachages MD5.
Quelle est la différence entre VARCHAR et CHAR dans MySQL ?
J'essaie de stocker des hachages MD5.
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).
@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.
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.
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.
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 ?
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.
Ville = char(10), Rue = varchar(10), ville = Pune, rue = Oxford, longueur(ville) = 4, longueur(rue) = 6
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)
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.
"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.
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.
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.
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.
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