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)