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)
Yada
la source
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.

Andomar
la source
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.

Brent
la source