web-dev-qa-db-fra.com

MySQL VARCHAR Lengths et UTF-8

En MySQL, si je crée un nouveau champ VARCHAR(32) dans une table UTF-8, cela signifie-t-il que je peux stocker 32 octets de données dans ce champ ou 32 caractères (multi-octets)?

70
Alix Axel

Cette réponse est apparue en haut de mes résultats de recherche Google mais n'était pas correcte alors:

La confusion est probablement due aux différentes versions de MySQL testées.

  • La version 4 compte le nombre d'octets
  • La version 5 compte les caractères

http://dev.mysql.com/doc/refman/5.0/fr/string-type-overview.html

MySQL interprète les spécifications de longueur dans les définitions de colonnes de caractères en unités de caractères. (Avant MySQL 4.1, les longueurs de colonne étaient interprétées en octets.) Ceci s'applique aux types CHAR, VARCHAR et TEXT. 

Fait intéressant (je n'y avais pas pensé), la longueur maximale d'une colonne varchar est affectée par utf8 comme suit:

La longueur maximale effective d'un VARCHAR dans MySQL 5.0.3 et versions ultérieures dépend de la taille maximale de la ligne (65 535 octets, qui est partagée entre toutes les colonnes) et du jeu de caractères utilisé. Par exemple, les caractères utf8 peuvent nécessiter jusqu'à trois octets par caractère. Ainsi, une colonne VARCHAR qui utilise le jeu de caractères utf8 peut être déclarée comme comportant au maximum 21 844 caractères. 

154
M Brown

cela vous permettrait de stocker 32 caractères multi-octets

Pour économiser de l'espace avec UTF-8, utilisez VARCHAR au lieu de CHAR. Autrement, MySQL doit réserver trois octets pour chaque caractère dans un CHAR CHARACTER SET La colonne utf8 car c’est le longueur maximale possible. Par exemple, MySQL doit réserver 30 octets pour un CHAR (10) CHARACTER SET colonne utf8.

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html

8
jspcal

32multibytesdata pour varchar(32) avec collation utf8_unicode_ci, je viens de tester avec XAMPP.

1234567890123456789012345678901234567890

Être tronqué à:

12345678901234567890123456789012

Gardez à l'esprit que ce ne sont pas des caractères ASCII normaux.

5
YOU

Il est préférable d'utiliser "char" pour les tables de mises à jour très fréquentes car la longueur totale des données de la ligne sera fixe et rapide. Les colonnes Varchar rendent les tailles de données de ligne dynamiques. Ce n'est pas bon pour MyISAM, mais je ne connais pas InnoDB ni les autres. Par exemple, si vous avez une colonne "type" très étroite, il peut être préférable d'utiliser char (2) avec un jeu de caractères latin1 pour ne réclamer qu'un espace minimal. 

1
Nudge

Si vous vous connectez à la base de données en utilisant un codage latin1 (par exemple avec PHP) pour enregistrer une chaîne PHP UTF8 dans une colonne MySQL UTF8, vous aurez un double codage UTF8.

Si la chaîne UTF8 $s comporte 32 caractères mais 64 octets et que la colonne est VARCHAR(32) UTF8, le double encodage convertira la chaîne $s en chaîne UTF8 de 64 caractères qui sera tronquée dans la base de données en ses 32 premiers caractères 32 premiers octets de $s. Vous finirez peut-être par penser que MySQL 5 se comporte comme MySQL 4 mais qu’il s’agit en fait d’une deuxième cause du même effet. 

0
Laurent Lyaudet