MySQL - length () vs char_length ()

215

Jaka jest główna różnica między length()i char_length()?

Wierzę, że ma to coś wspólnego z ciągami binarnymi i niebinarnymi. Czy istnieje jakiś praktyczny powód, aby przechowywać ciągi jako pliki binarne?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
Yada
źródło
2
Tak, istnieją praktyczne powody, aby przechowywać ciągi binarne, gdy są to ciągi binarne, np. Skompresowane.
sanmai

Odpowiedzi:

351

LENGTH()zwraca długość łańcucha mierzoną w bajtach .
CHAR_LENGTH()zwraca długość łańcucha mierzoną w znakach .

Jest to szczególnie istotne w przypadku Unicode, w którym większość znaków jest zakodowana w dwóch bajtach. Lub UTF-8, gdzie liczba bajtów jest różna. Na przykład:

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

Jak widać, znak Euro zajmuje 3 bajty (jest zakodowany jak 0xE282ACw UTF-8), mimo że jest tylko jednym znakiem.

Andomar
źródło
6
Tylko UCS-2 jest kodowany w dwóch bajtach na znak. To kodowanie (a dokładniej UTF-16LE) to, co Windows zwodniczo nazywa „Unicode”. MySQL nie obsługuje UTF-16; zamiast tego zwykłym podejściem do umieszczania w nim ciągów Unicode jest użycie UTF-8.
bobince
2
Na przykład: wybierz długość („日本語”), char_length („日本語”);
sanmai
@ bobince: Nawet UCS-2 koduje na przykład niektóre znaki w więcej niż 2 bajtach 0313 combining comma above. Ponieważ a = 61, 0x00610313 wyświetla się jako a̓ i zajmuje 4 bajty.
Andomar
2
Właściwie według terminologii Unicode, która wciąż składa się z 2 znaków, chociaż podobnie jak wszystkie znaki łączące, może - jeśli dostępna jest odpowiednia czcionka - być renderowana jako pojedynczy glif. UTF-16LE może nadal mieć 4-bajtowy znak, jednak dzięki surogatom.
bobince
6
Której z tych funkcji należy użyć, zastanawiając się, jak zmienić rozmiar kolumn VARCHAR? Podczas tworzenia tabeli powiedzmy, że jedna kolumna to VARCHAR (10). Czy pozwoli to na maksymalnie 10 znaków lub maksymalnie 10 bajtów?
still_dreaming_1
19

varchar (10) zapisze 10 znaków, które mogą mieć więcej niż 10 bajtów. W indeksach przydzieli maksymalną długość pola - więc jeśli używasz UTF8-mb4, przydzieli 40 bajtów dla 10-znakowego pola.

Brent
źródło