Wenn ich in MySQL ein neues VARCHAR(32)
Feld in einer UTF-8-Tabelle erstelle, bedeutet dies, dass ich 32 Datenbytes in diesem Feld oder 32 Zeichen (Multi-Byte) speichern kann?
Wenn ich in MySQL ein neues VARCHAR(32)
Feld in einer UTF-8-Tabelle erstelle, bedeutet dies, dass ich 32 Datenbytes in diesem Feld oder 32 Zeichen (Multi-Byte) speichern kann?
Antworten:
Diese Antwort wurde oben in meinen Google-Suchergebnissen angezeigt, war jedoch nicht korrekt.
Die Verwirrung ist wahrscheinlich darauf zurückzuführen, dass verschiedene Versionen von MySQL getestet werden.
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
MySQL interpretiert Längenangaben in Zeichenspaltendefinitionen in Zeicheneinheiten. (Vor MySQL 4.1 wurden die Spaltenlängen in Bytes interpretiert.) Dies gilt für die Typen CHAR, VARCHAR und TEXT.
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. Beispielsweise können utf8-Zeichen bis zu drei Bytes pro Zeichen erfordern, sodass eine VARCHAR-Spalte, die den utf8-Zeichensatz verwendet, mit maximal 21.844 Zeichen deklariert werden kann.
utf8mb4
) kann "💩💩💩💩💩💩💩💩💩💩" (10 Stapel Poo) speichern, das sind 10 Zeichen, aber 40 Bytes.
Damit können Sie 32 Multi-Byte-Zeichen speichern
Verwenden Sie VARCHAR anstelle von CHAR, um mit UTF-8 Platz zu sparen. 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. Beispielsweise muss MySQL 30 Bytes für eine CHAR (10) CHARACTER SET utf8-Spalte reservieren.
CHAR
und wenn ich es tue, ist es nicht beabsichtigt, Multi-Byte-Zeichen zu speichern, also bin ich sicher. Was ist mit VARCHAR
, sind Sie sicher, dass das Limit in Mehrbyte-Zeichen und nicht in Einzelbyte-Zeichen definiert ist?
32 Multibyte Daten für varchar(32)
mit Sortierung habe utf8_unicode_ci
ich gerade mit XAMPP getestet.
1234567890123456789012345678901234567890
Abschneiden auf:
12345678901234567890123456789012
Beachten Sie, dass dies keine regulären ASCII-Zeichen sind.
utf8
, aber dann bekommen Sie Unicode - Unterstützung in MySQL gebrochen. Sie sollten utf8mb4
stattdessen die Codierung verwenden, da max. 4 Bytes in einem utf-8-Zeichen , nicht 3 wie in MySQLs Variante von utf8 ...
Es ist besser, "char" für häufig verwendete 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ß nichts über InnoDB und andere. Wenn Sie beispielsweise eine sehr schmale "Typ" -Spalte haben, ist es möglicherweise besser, char (2) mit latin1-Zeichensatz zu verwenden, um nur minimalen Speicherplatz zu beanspruchen.
CHAR
. Für InnoDB sind so viele andere Dinge im Gange, dass die Debatte über "dynamische / feste Zeilengröße" im Wesentlichen irrelevant ist.
CHAR
.
Wenn Sie mithilfe der Latin1-Codierung (z. B. mit PHP) eine Verbindung zur Datenbank herstellen, um eine PHP-UTF8-Zeichenfolge in einer MySQL-UTF8-Spalte zu speichern, haben Sie eine doppelte UTF8-Codierung.
Wenn die UTF8-Zeichenfolge $s
32 Zeichen lang, aber 64 Byte lang ist und die Spalte VARCHAR(32)
UTF8 ist, konvertiert die Doppelcodierung die Zeichenfolge $s
in eine 64 Zeichen lange UTF8-Zeichenfolge, die in der Datenbank auf ihre 32 ersten Zeichen gekürzt wird, die den 32 ersten Bytes entsprechen von $s
. Möglicherweise denken Sie, dass sich MySQL 5 wie MySQL 4 verhält, aber es ist tatsächlich eine zweite Ursache für denselben Effekt.