Was ist die maximale Größe von MySQL VARCHAR?

300

Ich würde gerne wissen, wie groß die maximale Größe für einen MySQL VARCHAR-Typ ist.

Ich habe gelesen, dass die maximale Größe durch die Zeilengröße begrenzt ist, die ungefähr 65 KB beträgt. Ich habe versucht, das Feld auf einzustellen, varchar(20000)aber es sagt, dass das zu groß ist.

Ich könnte es einstellen varchar(10000). Was ist das genaue Maximum, auf das ich es einstellen kann?

user1832628
quelle
1
Ein Detail-Blog: goo.gl/Hli6G3
Suresh Kamrushi

Antworten:

293

Beachten Sie, dass MySQL eine maximale Zeilengröße hat

Die interne Darstellung einer MySQL-Tabelle hat eine maximale Zeilengrößenbeschränkung von 65.535 Byte, ohne BLOB- und TEXT-Typen. BLOB- und TEXT-Spalten tragen nur 9 bis 12 Byte zur Zeilengrößenbeschränkung bei, da ihr Inhalt getrennt vom Rest der Zeile gespeichert wird. Lesen Sie mehr über Grenzwerte für die Anzahl der Tabellenspalten und die Zeilengröße.

Die maximale Größe, die eine einzelne Spalte einnehmen kann, unterscheidet sich vor und nach MySQL 5.0.3

Werte in VARCHAR-Spalten sind Zeichenfolgen variabler Länge. Die Länge kann als Wert zwischen 0 und 255 vor MySQL 5.0.3 und zwischen 0 und 65.535 in Version 5.0.3 und höher angegeben werden. 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.

Beachten Sie jedoch, dass das Limit niedriger ist, wenn Sie einen Mehrbyte-Zeichensatz wie utf8 oder utf8mb4 verwenden.

Verwenden Sie TEXTinorder, um die Zeilengrößenbeschränkung zu überwinden.

Die vier TEXT-Typen sind TINYTEXT, TEXT, MEDIUMTEXT und LONGTEXT. Diese entsprechen den vier BLOB-Typen und haben die gleichen maximalen Längen und Speicheranforderungen.

Weitere Details zu BLOB- und TEXT-Typen

Sogar mehr

Kasse mehr Details zu Datentyp - Speicheranforderungen , die sie mit dem Speicherbedarf für alle Datentypen.

Rajukoyilandy
quelle
4
Was ist eine "lange" Saite?
Richard H
6
Ich versuche jedoch, TEXT-Spalten zu vermeiden, da sie dazu führen können, dass temporäre Tabellen erstellt werden, wenn sie vorhanden sind und sortiert werden
Robert Swisher,
1
Wenn ich varchar (200) als Vornamen nehme und nur 6 Zeichen in diesem Feld speichere, wie viele Bytes Vorname werden dann belegt?
Paresh Gami
2
@PareshGami - 6 + 1 = 7 Zeichen! Im Gegensatz zu CHAR werden VARCHAR-Werte als 1-Byte- oder 2-Byte-Längenpräfix plus Daten gespeichert. mehr ...
Rajukoyilandy
58

Gemäß den Online-Dokumenten gibt es eine Zeilenbeschränkung von 64 KB, und Sie können die Zeilengröße mithilfe von Folgendem ermitteln:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Sie müssen berücksichtigen, dass die Spaltenlängen keine Eins-zu-Eins-Zuordnung ihrer Größe sind. Benötigt beispielsweise CHAR(10) CHARACTER SET utf8drei Bytes für jedes der zehn Zeichen, da diese bestimmte Codierung die Eigenschaft von drei Bytes pro Zeichen berücksichtigen muss utf8(dies ist die MySQL- utf8Codierung anstelle von "echtem" UTF-8, das bis zu vier Bytes enthalten kann ).

Wenn sich Ihre Zeilengröße jedoch 64 KB nähert, möchten Sie möglicherweise das Schema Ihrer Datenbank untersuchen. Es ist eine seltene Tabelle, die in einer ordnungsgemäß eingerichteten (3NF) Datenbank so breit sein muss - es ist möglich, aber nicht sehr häufig.

Wenn Sie mehr als das verwenden möchten, können Sie die Typen BLOBoder TEXTverwenden. Diese werden nicht auf das 64-KB-Limit der Zeile angerechnet (abgesehen von einem geringen administrativen Platzbedarf). Sie müssen sich jedoch anderer Probleme bewusst sein, die sich aus ihrer Verwendung ergeben, z. B., dass Sie nicht über eine bestimmte Anzahl hinaus mit dem gesamten Textblock sortieren können Anzahl von Zeichen (obwohl dies nach oben konfiguriert werden kann), wodurch temporäre Tabellen gezwungen werden, sich auf der Festplatte und nicht im Speicher zu befinden, oder Client- und Server-Kommunikationspuffer konfiguriert werden müssen, um die Größen effizient zu handhaben.

Die zulässigen Größen sind:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Sie haben immer noch die Nichtübereinstimmung von Byte und Zeichen (so dass eine MEDIUMTEXT utf8Spalte "nur" etwa eine halbe Million Zeichen speichern kann (16M-1)/3 = 5,592,405), aber es erweitert Ihren Bereich immer noch erheblich.

paxdiablo
quelle
4
Beachten Sie, dass TEXT-Typen NICHT in Speichertabellen gespeichert werden können. Daher ist die Verwendung erheblich eingeschränkt, wenn ein VARCHAR ausreichen würde.
Camden S.
'Die Drei-Bytes-pro-Zeichen-Eigenschaft von utf8' von MySql utf8 , die eigentlich gar nicht utf8 ist. In Wirklichkeit ist die max. Bytes in einem utf-8-Zeichen sind 4 . Aus diesem Grund sollten Sie die Codierung utf8mb4in MySQL immer auf setzen . utf8mb4ist der Name von MySql für das, was der Rest des Wortes utf8 nennt.
Stijn de Witt
1
@StijndeWitt, danke dafür. Es wurde klargestellt, dass ich die utf8-Codierungsmethode von MySQL anstelle von UTF-8 meinte. Ich verwende im Allgemeinen die großgeschriebene Variante, um "echtes" UTF-8 anzuzeigen, da dies die akzeptierte IANA-Konvention ist.
Paxdiablo
41

Quelle

Die maximale Länge eines Varchars hängt von der maximalen Zeilengröße in MySQL ab, die 64 KB beträgt (ohne BLOBs):

VARCHAR (65535) Beachten Sie jedoch, dass das Limit niedriger ist, wenn Sie einen Mehrbyte-Zeichensatz verwenden:

VARCHAR (21844) CHARAKTER SET utf8

Attila
quelle
20
Bitte hören Sie auf, CHARACTER SET utf8Beispiele zu verwenden. Es sollte sein CHARACTER SET utf8mb4(wenn Sie möchten, dass der gesamte Unicode-Text ordnungsgemäß gespeichert wird ... und wer möchte das nicht?)
Stijn de Witt
4
Zur CHARSET=utf8mb4Verwendung VARCHAR(16383).
Wil Moore III
3
Wenn Sie utf8mb4 verwenden, werden Sie in einer Situation, in der utf8 dies nicht tut, an die Grenze der Indexbreite stoßen. Wenn Sie die Zeichensätze untersuchen, die in utf8mb4, aber nicht in utf8 enthalten sind, stellen Sie möglicherweise fest, dass das Einbeziehen aller verschiedenen Formen von Hieroglyphen und anderer solcher arkaner Zeichensätze den erheblichen Leistungsverlust (empirisch ermittelt) nicht wert ist. Es ist nicht ganz so geschnitten und getrocknet, wie Stijn impliziert.
Kcrossen
Viele Emojis sind auch in utf8mb4 vorhanden und fehlen in utf8, so dass sich möglicherweise die Gleichung ändert, ob es sich lohnt.
Brian Morearty
23

Aus der MySQL-Dokumentation:

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.

Die Grenzwerte für VARCHAR variieren je nach verwendetem Zeichensatz. Bei Verwendung von ASCII wird 1 Byte pro Zeichen verwendet. Das heißt, Sie könnten 65.535 Zeichen speichern. Bei Verwendung von utf8 werden 3 Bytes pro Zeichen verwendet, was zu einer Zeichenbegrenzung von 21.844 führt. ABER wenn Sie den modernen Multibyte-Zeichensatz utf8mb4 verwenden, den Sie verwenden sollten! Es unterstützt Emojis und andere Sonderzeichen. Es werden 4 Bytes pro Zeichen verwendet. Dadurch wird die Anzahl der Zeichen pro Tabelle auf 16.383 begrenzt. Beachten Sie, dass auch andere Felder wie INT bis zu diesen Grenzwerten gezählt werden.

Fazit:

utf8 maximal 21.844 Zeichen

utf8mb4 maximal 16.383 Zeichen

Firze
quelle
6

Sie können auch MEDIUMBLOB / LONGBLOB oder MEDIUMTEXT / LONGTEXT verwenden

Ein BLOB-Typ in MySQL kann bis zu 65.534 Byte speichern, wenn Sie versuchen, mehr als so viele Daten zu speichern, dass MySQL die Daten abschneidet. MEDIUMBLOB kann bis zu 16.777.213 Bytes speichern, und LONGBLOB kann bis zu 4.294.967.292 Bytes speichern.

SRIRAM
quelle
3

Vor MySQL Version 5.0.3 kann der Varchar-Datentyp 255 Zeichen speichern, ab 5.0.3 jedoch 65.535 Zeichen.

ABER es gibt eine Begrenzung der maximalen Zeilengröße von 65.535 Bytes. Dies bedeutet, dass alle Spalten nicht mehr als 65.535 Byte enthalten dürfen.

In Ihrem Fall ist es möglich, dass beim Versuch, mehr als 10000 festzulegen, mehr als 65.535 überschritten werden und MySQL den Fehler ausgibt.

Weitere Informationen: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

Blog mit Beispiel: http://goo.gl/Hli6G3

Suresh Kamrushi
quelle
-5

Sie können den TEXTTyp verwenden , der nicht auf 64 KB beschränkt ist.

mvp
quelle
31
Dies beantwortet die Frage nicht.
DreamWave
1
Ihre Antwort ist für die Frage nicht relevant.
Girish