A resposta aceita está errada (ou pelo menos bastante opinativa) - pessoalmente, não quero dados armazenados fora do meu banco de dados, pois cria complicações em termos de procedimentos de backup e consultas transacionais.
Como outros apontaram, o manual afirma repetidamente que as colunas BLOB e TEXT não contam para o tamanho total da linha, mas infelizmente, com as configurações padrão, isso não é verdade, e você acaba recebendo essa mensagem de erro. (A mensagem de erro não faz sentido, porque está dizendo para você usar TEXT em vez de VARCHAR para resolver o problema - o que você já está fazendo.)
O motivo dessa limitação é o mecanismo de armazenamento padrão, Antelope , que armazena os primeiros 768 bytes de colunas de comprimento variável na linha - e uma possível solução é usar o INNODB e mudar seu mecanismo de armazenamento para a alternativa Barracuda mecanismo de armazenamento:
SET GLOBAL innodb_file_format=Barracuda;
Isso não terá efeito imediato, porque essa configuração é um padrão para novos arquivos de banco de dados - portanto, você precisará descartar e recriar todo o banco de dados.
Alternativamente, mude para Barracuda (como acima) e então (além disso) mude para a estratégia de arquivo por tabela:
SET GLOBAL innodb_file_per_table=ON;
Novamente, isso não terá efeito imediato, porque ambas as configurações são padrões para novas tabelas - então, novamente, você precisará descartar e recriar a tabela.
Se você procurar na pasta de dados do MySQL depois de fazer isso, poderá confirmar que arquivos separados foram criados, por exemplo, para um banco de dados chamado "data" e uma tabela chamada "test", você deverá ver um arquivo chamado "data/test/bigtable.ibd".
Se você não gosta de alterar as configurações globais no MySQL, tente
SET SESSION
em vez de SET GLOBAL
, por exemplo. imediatamente antes de executar seu CREATE TABLE
declarações.