MySQL - длина () против char_length ()

215

Какая основная разница между length()а char_length()?

Я считаю, что это как-то связано с двоичными и недвоичными строками. Есть ли практическая причина хранить строки в двоичном виде?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
Яда
источник
2
Да, есть практические причины хранить двоичные строки, когда они на самом деле являются двоичными строками, например, сжатыми.
sanmai

Ответы:

351

LENGTH()возвращает длину строки, измеренную в байтах .
CHAR_LENGTH()возвращает длину строки, измеренную в символах .

Это особенно актуально для Unicode, в котором большинство символов кодируются двумя байтами. Или UTF-8, где количество байтов меняется. Например:

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

Как видите, знак евро занимает 3 байта (он закодирован как 0xE282ACв UTF-8), хотя это всего один символ.

Andomar
источник
6
Только UCS-2 кодируется двумя байтами на символ. Эта кодировка (или, точнее, UTF-16LE) - это то, что Windows вводит в заблуждение «Unicode». MySQL не поддерживает UTF-16; вместо этого обычный подход для помещения в него строк Unicode заключается в использовании UTF-8.
bobince
2
Например: выберите длину ('日本語'), char_length ('日本語');
sanmai
@bobince: Даже UCS-2 кодирует некоторые символы, например, более чем в 2 байта 0313 combining comma above. Поскольку a = 61, 0x00610313 отображается как a̓ и занимает 4 байта.
Andomar
2
На самом деле, согласно терминологии Unicode, это по-прежнему 2 символа, хотя, как и все метки объединения, он может - при наличии подходящего шрифта - отображаться как один глиф. UTF-16LE все еще может иметь 4-байтовый символ, хотя благодаря суррогатам.
bobince
6
Итак, какую из этих функций я должен использовать, чтобы выяснить, как изменить размер столбцов VARCHAR? При создании таблицы допустим, что один столбец является VARCHAR (10). Позволит ли это максимум 10 символов или максимум 10 байтов?
still_dreaming_1
19

varchar (10) будет хранить 10 символов, которые могут быть более 10 байтов. В индексах он будет выделять максимальную длину поля - поэтому, если вы используете UTF8-mb4, он выделит 40 байтов для поля из 10 символов.

казарка
источник