2009-11-14 10 views
155

Jaka jest główna różnica między length() a char_length()?MySQL - length() vs char_length()

Wierzę, że ma coś wspólnego z łańcuchami binarnymi i nie binarnymi. Czy istnieje jakiś praktyczny powód do przechowywania łańcuchów jako binarnych?

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

Tak, istnieją praktyczne powody do przechowywania ciągów binarnych, gdy faktycznie są ciągami binarnymi, np. sprężony. – sanmai

Odpowiedz

257

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

Jest to szczególnie istotne w przypadku formatu Unicode, w którym większość znaków jest kodowana 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 jako 0xE282AC w UTF-8), nawet jeśli jest to tylko jeden znak.

+3

Tylko UCS-2 jest kodowany w dwóch bajtach na znak. To kodowanie (lub dokładniej UTF-16LE) to, co Windows mylnie nazywa "Unicode". MySQL nie obsługuje UTF-16; zamiast tego zwykłe podejście do umieszczania w nim ciągów Unicode to użycie UTF-8. – bobince

+2

Na przykład: wybierz długość ("日本語"), char_length ("日本語"); – sanmai

+1

yesh! inny przykład: 'length ('华语')' vs 'char_length ('华语')' –

9

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