O comprimento máximo de um varchar está sujeito ao tamanho máximo da linha no MySQL, que é 64 KB (sem contar BLOBs):
VARCHAR(65535)
No entanto, observe que o limite é menor se você usar um conjunto de caracteres de vários bytes:
VARCHAR(21844) CHARACTER SET utf8
aqui estão alguns exemplos:
O tamanho máximo da linha é 65535, mas um varchar também inclui um ou dois bytes para codificar o comprimento de uma determinada string. Portanto, você não pode declarar um varchar com o tamanho máximo da linha, mesmo que seja a única coluna na tabela.
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
Mas se tentarmos diminuir os comprimentos, encontraremos o maior comprimento que funciona:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
Agora, se tentarmos usar um conjunto de caracteres multibyte no nível da tabela, descobriremos que ele conta cada caractere como vários bytes. Strings UTF8 não necessariamente use vários bytes por string, mas o MySQL não pode assumir que você restringirá todas as suas inserções futuras a caracteres de byte único.
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
Apesar do que o último erro nos disse, o InnoDB ainda não gosta de um comprimento de 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
Isso faz todo o sentido, se você calcular que 21845*3 =65535, o que não funcionaria de qualquer maneira. Considerando que 21844*3 =65532, o que funciona.
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)