Äquivalent von varchar (max) in MySQL?


Antworten:


195

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) CHARACTER SET utf8

Hier sind einige Beispiele:

Die maximale Zeilengröße beträgt 65535, aber ein Varchar enthält auch ein oder zwei Bytes, um die Länge einer bestimmten Zeichenfolge zu codieren. Sie können also keinen varchar mit der maximalen Zeilengröße deklarieren, selbst wenn dies die einzige Spalte in der Tabelle ist.

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Wenn wir jedoch versuchen, die Länge zu verringern, finden wir die größte Länge, die funktioniert:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Wenn wir nun versuchen, einen Multibyte-Zeichensatz auf Tabellenebene zu verwenden, stellen wir fest, dass jedes Zeichen als mehrere Bytes gezählt wird. UTF8-Zeichenfolgen verwenden nicht unbedingt mehrere Bytes pro Zeichenfolge, aber MySQL kann nicht davon ausgehen, dass Sie alle zukünftigen Einfügungen auf Einzelbytezeichen beschränken.

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

Trotz des letzten Fehlers mag InnoDB eine Länge von 21845 immer noch nicht.

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Dies ist absolut sinnvoll, wenn Sie 21845 * 3 = 65535 berechnen, was ohnehin nicht funktioniert hätte. Während 21844 * 3 = 65532, was funktioniert.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)

20
Ich würde auch vorschlagen, TEXT
Adi

2
@AdnanShammout: Sicher, es sei denn, Sie möchten einen DEFAULTWert für die Spalte deklarieren . Mit TEXT- oder BLOB-Typen geht das nicht.
Bill Karwin

5
@ DanW, TEXTLängenbegrenzung ist 64K. MEDIUMTEXTLängenbegrenzung ist 16M. LONGTEXTLängenbegrenzung ist 4G.
Bill Karwin

4
Das größte Problem dabei ist, dass Sie beim Erstellen einer Spalte dieser Größe nur diese eine Spalte in Ihrer Tabelle haben können. Die MAX Zeilengröße in MySql ist 64k, wenn Sie also eine 64k - Spalte haben, das ist alles , was Sie bekommen. Dieselbe Einschränkung gilt nicht für den Spaltentyp von SQL Server varchar(max).
Joshperry

1
@joshperry, ja, aber TEXT / BLOB-Spalten zählen nur einen kleinen Betrag (9-12 Byte) für diese 64-KB-Zeilengrößenbeschränkung. Wenn Sie also ein großes VARCHAR sowie eine Reihe anderer Spalten benötigen, ist es besser, TEXT zu verwenden.
Bill Karwin

74

TLDR; MySQL hat kein gleichwertiges Konzept varchar(max). Dies ist eine MS SQL Server-Funktion.

Was ist VARCHAR (max)?

varchar(max) ist eine Funktion von Microsoft SQL Server.

Die Datenmenge, die eine Spalte in Microsoft SQL Server-Versionen vor Version 2005 speichern konnte, war auf 8 KB begrenzt. Um mehr als 8 KB speichern würden Sie verwenden müssen TEXT, NTEXToder BLOBSpalten - Typen, diese Spaltentypen ihre Daten als eine Sammlung von 8K - Seiten gespeichert , getrennt von der den Tabellendatenseite; Sie unterstützten das Speichern von bis zu 2 GB pro Zeile.

Der große Nachteil dieser Spaltentypen war , dass sie in der Regel spezielle Funktionen und Anweisungen für den Zugriff und ändern Sie die erforderlichen Daten (zB READTEXT, WRITETEXTund UPDATETEXT)

In SQL Server 2005 varchar(max)wurde eingeführt, um die Daten und Abfragen zu vereinheitlichen, die zum Abrufen und Ändern von Daten in großen Spalten verwendet werden. Die Daten für varchar(max)Spalten werden inline mit den Tabellendatenseiten gespeichert.

Wenn die Daten in der MAX-Spalte eine 8-KB-Datenseite füllen, wird eine Überlaufseite zugewiesen, und die vorherige Seite zeigt darauf und bildet eine verknüpfte Liste. Im Gegensatz zu TEXT, NTEXTund BLOBder varchar(max)Spaltentyp unterstützt alle die gleiche Abfragesemantik als andere Spaltentypen.

Also varchar(MAX)wirklich bedeutet varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)und nicht varchar(MAX_SIZE_OF_A_COLUMN).

MySql hat keine äquivalente Sprache.

Um die gleiche Speichermenge wie varchar(max)in MySql zu erhalten, müssten Sie immer noch auf einen Spaltentyp zurückgreifen BLOB. Dieser Artikel beschreibt eine sehr effektive Methode zum effizienten Speichern großer Datenmengen in MySQL.


1
Dies hat mehr mit SQL Server als mit MySQL zu tun.
Kermit

14
@njk Ja, aber um zu erklären, was das "Äquivalent" in MySql (oder das Fehlen eines Äquivalents in diesem Fall) erforderlich machte, musste genau beschrieben werden, was varchar(max) wirklich bedeutet.
Joshperry

29

Die maximale Länge eines Varchars beträgt

65535

geteilt durch die maximale Bytelänge eines Zeichens im Zeichensatz, auf den die Spalte gesetzt ist (z. B. utf8 = 3 Bytes, ucs2 = 2, latin1 = 1).

minus 2 Bytes zum Speichern der Länge

abzüglich der Länge aller anderen Spalten

minus 1 Byte für jeweils 8 Spalten, die nullbar sind. Wenn Ihre Spalte null / nicht null ist, wird dies als ein Bit in einem Byte / Bytes gespeichert, das als Nullmaske bezeichnet wird, 1 Bit pro Spalte, das nullwertfähig ist.


Ich mag das Format Ihrer Antwort, aber es scheint einige nützliche Informationen zu fehlen, die die Top-Antwort in Bezug auf Zeichensätze und Sachen liefert
Joe Phillips

3

Für SQL Server

Tabelle ändern prg_ar_report_colors Text_Color_Code hinzufügen VARCHAR (max);

Für MySql

alter table prg_ar_report_colors add Text_Color_Code longtext;

Für Oracle

Tabelle ändern prg_ar_report_colors Text_Color_Code CLOB hinzufügen;


1
Beachten Sie, dass Langtext, Text und Blob anders als varchar gespeichert werden. varchar wird mit den anderen Feldern gespeichert, während Text in einer separaten Datei auf dem Server gespeichert wird. Es hat Vor- und Nachteile, die so sorgfältig sind, welche man wählen soll
Santiago Arizona

0

MySQL Konvertieren der Spalte von VARCHAR in TEXT unter Grenzgröße !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

-11

Die maximale Länge eines Varchars in MySQL 5.6.12 beträgt 4294967295.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.