MySQL VARCHAR Lengths und UTF-8

Wenn ich in MySQL ein neues VARCHAR(32) -Feld in einer UTF-8-Tabelle erstelle, heißt das, dass ich 32 Bytes Daten in diesem Feld oder 32 Zeichen (Multi-Byte) speichern kann?

   

    Diese Antwort tauchte oben in meinen Google-Suchergebnissen auf, war aber nicht korrekt:

    Die Verwirrung ist wahrscheinlich auf verschiedene Versionen von MySQL zurückzuführen, die getestet werden.

    • Version 4 zählt Bytes
    • Version 5 zählt Zeichen

    http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

    MySQL interpretiert Längenangaben in Zeichenspaltedefinitionen in Zeicheneinheiten. (Vor MySQL 4.1 wurden die Spaltenlängen in Bytes interpretiert.) Dies gilt für CHAR-, VARCHAR- und TEXT-Typen.

    Interessanterweise (ich hatte nicht darüber nachgedacht) wird die maximale Länge einer varchar-Spalte von utf8 wie folgt beeinflusst:

    Die effektive maximale Länge eines VARCHAR in MySQL 5.0.3 und höher hängt von der maximalen Zeilengröße (65.535 Byte, die von allen Spalten gemeinsam genutzt wird) und dem verwendeten Zeichensatz ab. Zum Beispiel können utf8-Zeichen bis zu drei Bytes pro Zeichen benötigen, sodass eine VARCHAR-Spalte, die den utf8-Zeichensatz verwendet, maximal 21.844 Zeichen umfassen kann.

    Sie können 32 Multi-Byte-Zeichen speichern

    Um mit UTF-8 Speicherplatz zu sparen, verwenden Sie VARCHAR anstelle von CHAR. Andernfalls muss MySQL drei Bytes für jedes Zeichen in einer CHAR CHARACTER SET utf8-Spalte reservieren, da dies die maximal mögliche Länge ist. Zum Beispiel muss MySQL 30 Bytes für eine Spalte CHAR (10) CHARACTER SET utf8 reservieren.

    http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html

    32 Multibyte- Daten für varchar(32) mit Kollation utf8_unicode_ci , habe ich gerade mit XAMPP getestet.

     1234567890123456789012345678901234567890 

    Abgeschnitten zu:

     12345678901234567890123456789012 

    Beachten Sie, dass dies keine regulären ASCII-Zeichen sind.

    Es ist besser, “char” für High-Frequent-Aktualisierungstabellen zu verwenden, da die Gesamtdatenlänge der Zeile fest und schnell ist. Varchar-Spalten machen die Zeilendatengrößen dynamisch. Das ist nicht gut für MyISAM, aber ich weiß nicht über InnoDB und andere. Wenn Sie beispielsweise eine sehr schmale “type” -Spalte haben, ist es möglicherweise besser, char (2) mit latin1-Zeichensatz zu verwenden, um nur minimalen Speicherplatz zu beanspruchen.

    Wenn Sie eine Verbindung zur database mithilfe der Latin1-Codierung herstellen (z. B. mit PHP), um eine PHP UTF8-Zeichenfolge in einer MySQL UTF8-Spalte zu speichern, verfügen Sie über eine doppelte UTF8-Codierung.

    Wenn die UTF8-Zeichenfolge $s 32 Zeichen lang, aber 64 Byte lang und die Spalte VARCHAR(32) UTF8 ist, wird die doppelte Codierung die Zeichenfolge $s in eine 64 Zeichen lange UTF8-Zeichenfolge konvertieren, die in der database auf 32 abgeschnitten wird erste Zeichen, die den 32 ersten Bytes von $s . Möglicherweise denken Sie, dass sich MySQL 5 wie MySQL 4 verhält, aber es ist in der Tat eine zweite Ursache für denselben Effekt.