MySQL - length () vs char_length ()


215

Quelle est la principale différence entre length() et char_length()?

Je crois que cela a quelque chose à voir avec les chaînes binaires et non binaires. Y a-t-il une raison pratique de stocker des chaînes au format binaire?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
Oui, il existe des raisons pratiques de stocker des chaînes binaires alors qu'elles sont en réalité des chaînes binaires, par exemple compressées.
sanmai

Réponses:


351

LENGTH()renvoie la longueur de la chaîne mesurée en octets .
CHAR_LENGTH()renvoie la longueur de la chaîne mesurée en caractères .

Ceci est particulièrement pertinent pour Unicode, dans lequel la plupart des caractères sont codés sur deux octets. Ou UTF-8, où le nombre d'octets varie. Par exemple:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

Comme vous pouvez le voir, le signe Euro occupe 3 octets (il est codé comme 0xE282ACen UTF-8) même s'il ne s'agit que d'un seul caractère.


6
Seul UCS-2 est codé en deux octets par caractère. Cet encodage (ou plus précisément UTF-16LE) est ce que Windows appelle à tort "Unicode". MySQL ne prend pas en charge UTF-16; à la place, l'approche habituelle pour y mettre des chaînes Unicode est d'utiliser UTF-8.
bobince

2
Par exemple: sélectionnez longueur ('日本語'), char_length ('日本語');
sanmai

@bobince: même UCS-2 code certains caractères sur plus de 2 octets, par exemple 0313 combining comma above. Puisque a = 61, 0x00610313 s'affiche comme a̓, et il prend 4 octets.
Andomar

2
En fait, selon la terminologie Unicode, il y a toujours 2 caractères, même si, comme toutes les marques de combinaison, il peut - si une police appropriée est disponible - être rendu sous la forme d'un seul glyphe. UTF-16LE peut toujours avoir un caractère de 4 octets grâce aux substituts.
bobince

6
Alors, laquelle de ces fonctions dois-je utiliser pour déterminer comment redimensionner mes colonnes VARCHAR? Lors de la création du tableau, disons qu'une colonne est un VARCHAR (10). Cela permettra-t-il un maximum de 10 caractères ou un maximum de 10 octets?
still_dreaming_1

19

varchar (10) stockera 10 caractères, qui peuvent dépasser 10 octets. Dans les index, il allouera la longueur maximale du champ - donc si vous utilisez UTF8-mb4, il allouera 40 octets pour le champ de 10 caractères.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.