Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Äquivalent von varchar(max) in MySQL?

Die maximale Länge eines Varchar unterliegt der maximalen Zeilengröße in MySQL, die 64 KB beträgt (BLOBs nicht mitgezählt):

VARCHAR(65535)

Beachten Sie jedoch, dass das Limit niedriger ist, wenn Sie einen Multi-Byte-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 eigentlich kein Varchar mit der maximalen Zeilengröße deklarieren, selbst wenn es 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

Aber wenn wir versuchen, Längen 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-Strings nicht unbedingt Verwenden Sie mehrere Bytes pro Zeichenfolge, aber MySQL kann nicht davon ausgehen, dass Sie alle Ihre zukünftigen Einfügungen auf Einzelbyte-Zeichen 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 allem, was der letzte Fehler uns gesagt hat, mag InnoDB immer noch keine Länge von 21845.

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

Das macht durchaus Sinn, wenn man das 21845*3 =65535 ausrechnet, was sowieso nicht funktioniert hätte. Wohingegen 21844*3 =65532, was funktioniert.

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