MySQL - length () vs char_length ()

215

Was ist der Hauptunterschied zwischen length()und char_length()?

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

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
Yada
quelle
2
Ja, es gibt praktische Gründe, Binärzeichenfolgen zu speichern, wenn es sich tatsächlich um Binärzeichenfolgen handelt, z. B. komprimiert.
Sanmai

Antworten:

351

LENGTH()Gibt die Länge der Zeichenfolge in Byte zurück .
CHAR_LENGTH()Gibt die Länge der Zeichenfolge in Zeichen zurück .

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

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

Wie Sie sehen können, belegt das Euro-Zeichen 3 Bytes (es ist wie 0xE282ACin UTF-8 codiert ), obwohl es nur ein Zeichen ist.

Andomar
quelle
6
Nur UCS-2 wird in zwei Bytes pro Zeichen codiert. Diese Codierung (oder genauer UTF-16LE) nennt Windows irreführend „Unicode“. MySQL unterstützt UTF-16 nicht. Stattdessen wird normalerweise UTF-8 verwendet, um Unicode-Zeichenfolgen einzufügen.
Bobince
2
Zum Beispiel: Wählen Sie Länge ('日本語'), char_length ('日本語');
Sanmai
@bobince: Sogar UCS-2 codiert zum Beispiel einige Zeichen in mehr als 2 Bytes 0313 combining comma above. Da a = 61 ist, wird 0x00610313 als a̓ angezeigt und benötigt 4 Byte.
Andomar
2
Nach der Unicode-Terminologie sind das immer noch 2 Zeichen, obwohl es wie alle kombinierten Markierungen - sofern eine geeignete Schriftart verfügbar ist - als einzelne Glyphe gerendert werden kann. UTF-16LE kann dank der Ersatzzeichen dennoch einen 4-Byte-Charakter haben.
Bobince
6
Welche dieser Funktionen sollte ich verwenden, um herauszufinden, wie ich die Größe meiner VARCHAR-Spalten ändern kann? Angenommen, eine Spalte ist beim Erstellen der Tabelle ein VARCHAR (10). Erlaubt das maximal 10 Zeichen oder maximal 10 Bytes?
still_dreaming_1
19

varchar (10) speichert 10 Zeichen, die mehr als 10 Bytes umfassen können. In Indizes wird die maximale Länge des Felds zugewiesen. Wenn Sie also UTF8-mb4 verwenden, werden dem 10-Zeichen-Feld 40 Byte zugewiesen.

Brent
quelle