Максимальная длина varchar зависит от максимального размера строки в MySQL, который составляет 64 КБ (не считая 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)