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-символьного поля.