Den maximala längden för en varchar är beroende av den maximala radstorleken i MySQL, som är 64KB (exklusive BLOB):
VARCHAR(65535)
Observera dock att gränsen är lägre om du använder en multi-byte teckenuppsättning:
VARCHAR(21844) CHARACTER SET utf8
Här är några exempel:
Den maximala radstorleken är 65535, men en varchar innehåller också en byte eller två för att koda längden på en given sträng. Så du kan faktiskt inte deklarera en varchar med maximal radstorlek, även om det är den enda kolumnen 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 om vi försöker minska längder hittar vi den största längden som fungerar:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
Om vi nu försöker använda en multibyte-teckenuppsättning på tabellnivå, finner vi att den räknar varje tecken som flera byte. UTF8-strängar nödvändigtvis använd flera byte per sträng, men MySQL kan inte anta att du kommer att begränsa alla dina framtida infogningar till enbyte-tecken.
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
Trots vad det senaste felet berättade för oss, gillar InnoDB fortfarande inte en längd 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
Detta är helt vettigt, om du beräknar att 21845*3 =65535, vilket inte skulle ha fungerat ändå. Medan 21844*3 =65532, vilket fungerar.
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)