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)
Odpowiedzi:
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:
Jak widać, znak Euro zajmuje 3 bajty (jest zakodowany jak
0xE282AC
w UTF-8), mimo że jest tylko jednym znakiem.źródło
0313 combining comma above
. Ponieważ a = 61, 0x00610313 wyświetla się jako a̓ i zajmuje 4 bajty.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.
źródło