sql >> Database >  >> RDS >> Mysql

Equivalent van varchar(max) in MySQL?

De maximale lengte van een varchar is afhankelijk van de maximale rijgrootte in MySQL, die 64 KB is (BLOB's niet meegerekend):

VARCHAR(65535)

Houd er echter rekening mee dat de limiet lager is als u een tekenset van meerdere bytes gebruikt:

VARCHAR(21844) CHARACTER SET utf8

Hier zijn enkele voorbeelden:

De maximale rijgrootte is 65535, maar een varchar bevat ook een byte of twee om de lengte van een bepaalde string te coderen. Je kunt dus eigenlijk geen varchar met de maximale rijgrootte declareren, zelfs niet als het de enige kolom in de tabel is.

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

Maar als we proberen de lengtes te verkleinen, vinden we de grootste lengte die werkt:

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

Als we nu een multibyte-tekenset op tabelniveau proberen te gebruiken, zien we dat elk teken als meerdere bytes telt. UTF8-strings zijn niet noodzakelijk gebruik meerdere bytes per tekenreeks, maar MySQL kan er niet van uitgaan dat u al uw toekomstige invoegingen beperkt tot tekens van één byte.

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

Ondanks wat de laatste fout ons vertelde, houdt InnoDB nog steeds niet van een lengte van 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

Dit is volkomen logisch, als je 21845*3 =65535 berekent, wat sowieso niet zou hebben gewerkt. Terwijl 21844*3 =65532, wat wel werkt.

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


  1. Beste nieuwe functies in PostgreSQL 14

  2. Is het mogelijk om Full Text Search (FTS) te gebruiken met LINQ?

  3. Waarom is CTE beter dan cursor/afgeleide tabel/subquery's/temp-tabel enz.?

  4. Hoe alle ongeldige pakketten in Schema te compileren?