Den maksimale længde af en varchar er underlagt den maksimale rækkestørrelse i MySQL, som er 64KB (ikke tæller BLOB'er):
VARCHAR(65535)
Bemærk dog, at grænsen er lavere, hvis du bruger et multi-byte tegnsæt:
VARCHAR(21844) CHARACTER SET utf8
Her er nogle eksempler:
Den maksimale rækkestørrelse er 65535, men en varchar inkluderer også en byte eller to til at kode længden af en given streng. Så du kan faktisk ikke erklære en varchar af den maksimale rækkestørrelse, selvom det er den eneste kolonne i tabellen.
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
Men hvis vi prøver at reducere længder, finder vi den største længde, der virker:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
Hvis vi nu prøver at bruge et multibyte-tegnsæt på tabelniveau, finder vi ud af, at det tæller hvert tegn som flere bytes. UTF8-strenge gør det ikke nødvendigvis brug flere bytes pr. streng, men MySQL kan ikke antage, at du vil begrænse alle dine fremtidige indsættelser til enkeltbyte-tegn.
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
På trods af hvad den sidste fejl fortalte os, kan InnoDB stadig ikke lide en længde på 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
Dette giver god mening, hvis du beregner, at 21845*3 =65535, hvilket alligevel ikke ville have fungeret. Hvorimod 21844*3 =65532, hvilket virker.
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)