2009-11-14 6 views
155

Was ist der Hauptunterschied zwischen length() und char_length()?MySQL - length() vs char_length()

Ich glaube, es hat etwas mit binären und nicht-binären Zeichenfolgen zu tun. Gibt es einen praktischen Grund, Strings als Binärdateien zu speichern?

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

Ja, es gibt praktische Gründe, binäre Zeichenfolgen zu speichern, wenn sie tatsächlich binäre Zeichenfolgen sind, z. komprimiert. – sanmai

Antwort

257

LENGTH() gibt die Länge der Zeichenkette gemessen in Bytes.
CHAR_LENGTH() gibt die Länge der Zeichenfolge zurück, die in Zeichen gemessen wird.

Dies ist besonders relevant für Unicode, in dem die meisten Zeichen in zwei Bytes codiert sind. Oder UTF-8, wobei die Anzahl der Bytes variiert. Zum Beispiel:

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

Wie Sie die Euro-Zeichen belegen 3 Bytes sehen (es als 0xE282AC in UTF-8 kodiert ist), obwohl es nur ein Zeichen ist.

+3

Nur UCS-2 ist in zwei Bytes pro Zeichen codiert. Diese Codierung (oder genauer UTF-16LE) ist das, was Windows fälschlicherweise "Unicode" nennt. MySQL unterstützt UTF-16 nicht; Stattdessen wird UTF-8 normalerweise verwendet, um Unicode-Zeichenfolgen einzufügen. – bobince

+2

Zum Beispiel: Wählen Sie die Länge ('日本語'), char_length ('日本語'); – sanmai

+1

ja! ein anderes Beispiel: 'length ('华语')' vs 'char_length ('华语')' –

9

varchar (10) speichert 10 Zeichen, die mehr als 10 Byte sein können. In Indizes wird die Maximallänge des Felds zugewiesen. Wenn Sie also UTF8-mb4 verwenden, weist es dem 10-Zeichen-Feld 40 Bytes zu.