Maximální délka varcharu závisí na maximální velikosti řádku v MySQL, která je 64 kB (nepočítám objekty BLOB):
VARCHAR(65535)
Pamatujte však, že limit je nižší, pokud používáte vícebajtovou znakovou sadu:
VARCHAR(21844) CHARACTER SET utf8
Zde je několik příkladů:
Maximální velikost řádku je 65535, ale varchar také obsahuje jeden nebo dva bajty pro zakódování délky daného řetězce. Takže vlastně nemůžete deklarovat varchar s maximální velikostí řádku, i když je to jediný sloupec v tabulce.
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
Ale pokud zkusíme zmenšit délky, najdeme největší délku, která funguje:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
Když se nyní pokusíme použít vícebajtovou znakovou sadu na úrovni tabulky, zjistíme, že počítá každý znak jako více bajtů. Řetězce UTF8 nejsou nezbytně použijte více bajtů na řetězec, ale MySQL nemůže předpokládat, že všechny své budoucí vkládání omezíte na jednobajtové znaky.
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
Navzdory tomu, co nám řekla poslední chyba, InnoDB stále nemá rád délku 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
To dává dokonalý smysl, pokud spočítáte, že 21845*3 =65535, což by stejně nefungovalo. Zatímco 21844*3 =65532, což funguje.
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)