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), хоча це лише один символ.


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 байти.
Андомар

2
Насправді термінологія Unicode, яка все ще має два символи, хоча, як і всі комбіновані позначки, вона може - якщо є відповідний шрифт, - відображатися як один гліф. UTF-16LE все ще може мати 4-байтний символ, хоча завдяки сурогатам.
bobince

6
Отже, яку з цих функцій я повинен використовувати, коли з'ясовую, як змінити розмір своїх стовпців VARCHAR? Створюючи таблицю, скажімо, один стовпець - VARCHAR (10). Чи дозволить це максимум 10 символів або максимум 10 байт?
still_dreaming_1

19

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.