it-swarm.com.de

MySQL VARCHAR-Längen und UTF-8

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

70
Alix Axel

Diese Antwort wurde oben in meinen Google-Suchergebnissen angezeigt, war jedoch nicht korrekt.

Die Verwirrung beruht wahrscheinlich auf verschiedenen getesteten MySQL-Versionen.

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

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

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

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

Die effektive maximale Länge einer 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. Für utf8-Zeichen können beispielsweise bis zu drei Byte pro Zeichen erforderlich sein. Eine VARCHAR-Spalte, die den utf8-Zeichensatz verwendet, kann mit maximal 21.844 Zeichen deklariert werden. 

154
M Brown

damit können Sie 32 Multi-Byte-Zeichen speichern

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

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

8
jspcal

32multibytesdata für varchar(32) mit Sortierung utf8_unicode_ci habe ich gerade mit XAMPP getestet.

1234567890123456789012345678901234567890

Abgeschnitten zu:

12345678901234567890123456789012

Beachten Sie, dass es sich nicht um reguläre ASCII - Zeichen handelt.

5
YOU

Es ist besser, "char" für Tabellen mit häufigen Aktualisierungen 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ß nichts über InnoDB und andere. Wenn Sie beispielsweise eine sehr enge "Typ" -Spalte haben, empfiehlt es sich, char (2) mit latin1-Zeichensatz zu verwenden, um nur minimalen Speicherplatz zu beanspruchen. 

1
Nudge

Wenn Sie mit latin1-Kodierung (z. B. mit PHP) eine Verbindung zur Datenbank herstellen, um eine PHP -UTF8-Zeichenfolge in einer MySQL-UTF8-Spalte zu speichern, verfügen Sie über eine doppelte UTF8-Kodierung.

Wenn der UTF8-String $s 32 Zeichen lang und 64 Byte lang ist und die Spalte VARCHAR(32) UTF8 ist, konvertiert die Doppelkodierung den String $s in einen 64 Zeichen langen UTF8-String, der in der Datenbank auf seine 32 ersten Zeichen entsprechend gekürzt wird 32 erste Bytes von $s. Sie denken vielleicht, dass sich MySQL 5 wie MySQL 4 verhält, aber es ist tatsächlich eine zweite Ursache für den gleichen Effekt. 

0
Laurent Lyaudet