MySQL - length() vs char_length()

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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