Максималната дължина на varchar зависи от максималния размер на реда в MySQL, който е 64KB (без да се броят BLOB):
VARCHAR(65535)
Имайте предвид обаче, че ограничението е по-ниско, ако използвате многобайтов набор от знаци:
VARCHAR(21844) CHARACTER SET utf8
Ето няколко примера:
Максималният размер на реда е 65535, но varchar включва също байт или два за кодиране на дължината на даден низ. Така че всъщност не можете да декларирате varchar с максимален размер на ред, дори ако това е единствената колона в таблицата.
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
Но ако се опитаме да намалим дължините, ще намерим най-голямата дължина, която работи:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
Сега, ако се опитаме да използваме многобайтов набор от знаци на ниво таблица, ще открием, че той отчита всеки знак като множество байта. UTF8 низовете не са непременно използвайте няколко байта на низ, но MySQL не може да приеме, че ще ограничите всичките си бъдещи вмъквания до еднобайтови знаци.
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
Въпреки това, което ни каза последната грешка, InnoDB все още не харесва дължина от 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
Това е напълно логично, ако изчислите, че 21845*3 =65535, което така или иначе не би работило. Докато 21844*3 =65532, което работи.
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)