Erro 1366 MySQL: Incorrect string value, como resolver
Entenda o erro 1366 do MySQL, confira o conjunto de caracteres da coluna e veja as causas: utf8mb3, conexão errada, modo estrito e como converter para utf8mb4.
Por Redação Eleven Host · @robson.direitodigital · 31 de outubro de 2026 · 9 min de leitura

Capa da Redação Eleven Host para o guia: Erro 1366 MySQL: Incorrect string value, como resolver Arte: Eleven Host
O erro 1366 MySQL aparece quando o valor enviado não serve para a coluna: o tipo ou o conjunto de caracteres dela não aceita aquele dado. Um exemplo é gravar texto com caracteres suplementares, como muitos emojis, numa coluna que não é utf8mb4.
Aqui você vê como ler a mensagem "Incorrect string value" e a variação "Incorrect integer value", como conferir o conjunto de caracteres da coluna e as causas: utf8mb3, conexão com o conjunto errado e valor inválido no modo estrito. No fim, a conversão para utf8mb4 e a diferença para o erro 1406. Os fatos vêm do manual do MySQL 8.4; os nomes dos exemplos são fictícios.
O que a mensagem diz
Na referência de erros do servidor do MySQL 8.4, o erro 1366 tem o símbolo ER_TRUNCATED_WRONG_VALUE_FOR_FIELD, o SQLSTATE HY000 e este formato de mensagem:
Incorrect %s value: '%s' for column '%s' at row %ld
A referência traz só número, símbolo, SQLSTATE e mensagem, sem explicar causas. Pelo formato, o primeiro %s é o tipo do valor, o segundo é o valor recusado, o terceiro é a coluna e o número final é a linha. O manual mostra duas formas. Na primeira, o tipo é "string", no exemplo de um caractere que não existe no conjunto da coluna:
Incorrect string value: '\xE6\xB1\x8CB' for column 'gb2312' at row 1
Na segunda, o tipo é "integer", e o exemplo do manual é gravar o texto 'abc' numa coluna inteira:
ERROR 1366 (HY000): Incorrect integer value: 'abc' for column 'i' at row 1
O valor recusado e o nome da coluna estão na própria mensagem. Comece por eles: é a coluna citada que você precisa investigar.
Primeiro passo: ver o conjunto de caracteres da tabela e da coluna
Antes de mudar algo, veja com que conjunto de caracteres a coluna foi criada. Comandos montados com a sintaxe do manual, com nomes fictícios:
SHOW CREATE TABLE minha_tabela;
SHOW FULL COLUMNS FROM minha_tabela;
O SHOW CREATE TABLE mostra o comando que cria a tabela. O FULL do SHOW COLUMNS faz a saída incluir também a collation de cada coluna, além de comentários e privilégios. Outra opção é consultar a tabela COLUMNS do information_schema, que tem as colunas CHARACTER_SET_NAME e COLLATION_NAME:
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'minha_base' AND TABLE_NAME = 'minha_tabela';
Esta consulta é montada com as colunas e filtros que o manual descreve. Segundo a página, o conjunto também aparece no começo da collation, antes do primeiro sublinhado: utf8mb4 em utf8mb4_0900_ai_ci. Se a coluna do erro mostra utf8mb3 ou outro conjunto sem o caractere enviado, você achou a primeira pista.
Causa 1: utf8mb3 no lugar de utf8mb4
Segundo o manual, o plano básico (BMP) vai de U+0000 a U+FFFF, e os caracteres suplementares vão de U+10000 a U+10FFFF. Muitos emojis ficam no segundo grupo; isso é um fato do Unicode, e não uma frase do manual do MySQL.
A diferença entre os conjuntos, segundo a documentação:
- utf8mb4: suporta BMP e caracteres suplementares e usa no máximo quatro bytes por caractere.
- utf8mb3: suporta só BMP, com no máximo três bytes por caractere, e está descontinuado (deprecated).
- utf8: é um apelido descontinuado de utf8mb3. O manual orienta indicar utf8mb4 de forma explícita para evitar ambiguidade.
Para um caractere suplementar, o utf8mb4 precisa de quatro bytes, e o utf8mb3 não consegue guardá-lo. Por isso uma coluna utf8mb3 pode recusar esse tipo de texto. Atenção: utf8 não é sinônimo de utf8mb4.
Causa 2: a conexão usa o conjunto errado
Mesmo com a coluna certa, o texto passa pela conexão antes de chegar à tabela. O manual descreve três variáveis:
character_set_client: o conjunto de caracteres em que o servidor considera que o cliente envia as instruções.character_set_connection: o servidor converte as instruções decharacter_set_clientpara este conjunto.character_set_results: o conjunto em que o servidor devolve resultados ao cliente.
Para ver como a sua sessão está:
SHOW SESSION VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'collation\_%';
Se o cliente envia em um conjunto e a variável indica outro, o texto pode chegar ao servidor diferente do que você digitou. Esta é uma leitura nossa das descrições acima, e não uma frase do manual. Para acertar a sessão, o manual diz que SET NAMES 'charset_name' equivale a ajustar as três variáveis para o mesmo conjunto:
SET NAMES 'utf8mb4';
Na página de conversão, o manual mostra exatamente este comando e diz que ele faz a conexão usar o conjunto de quatro bytes. No cliente de linha de comando, a opção --default-character-set indica o conjunto explicitamente. Em aplicativos, procure na documentação deles onde configurar o conjunto da conexão.
Quer conhecer o banco de dados na nuvem 11SQL? 11SQL Mini a partir de R$ 9,90/mês; confira na loja o que cada plano inclui. Conhecer o 11SQL
Causa 3: valor inválido com o modo estrito ligado
O 1366 também aparece quando o tipo do dado não bate com o da coluna, como o texto 'abc' numa coluna inteira. O que o servidor faz depende do sql_mode.
O manual diz que o modo SQL padrão do MySQL 8.4 inclui, entre outros, o STRICT_TRANS_TABLES. No modo estrito, o servidor transforma certos avisos em erros. Em tabelas transacionais, com um desses modos ligados, o comando é abortado e desfeito.
Sem o modo estrito, o resultado é outro: o servidor insere um valor ajustado e gera um aviso. O manual mostra o contraste com o mesmo comando:
SET sql_mode = '';
INSERT INTO t (i) VALUES('abc');
SHOW WARNINGS;
Nesse caso, o 'abc' vira 0 e o aviso 1366 é registrado. Com SET sql_mode = 'STRICT_ALL_TABLES';, o mesmo INSERT é rejeitado com o erro. No exemplo do gb2312, o caractere é trocado por ? sem modo estrito; com ele, vira erro e o INSERT falha.
Para ver o modo atual, use SELECT @@GLOBAL.sql_mode; e SELECT @@SESSION.sql_mode;. Segundo o manual, mudar o valor global exige o privilégio SYSTEM_VARIABLES_ADMIN (ou o SUPER, já descontinuado) e afeta os clientes que se conectarem depois; a mudança de sessão afeta só o cliente atual.
Desligar o modo estrito para o erro sumir troca o erro por dado ajustado ou perdido. O caminho é corrigir o dado enviado ou a coluna.
Como converter a tabela para utf8mb4
Se a causa é uma coluna utf8mb3 (ou outro conjunto sem o caractere), a correção é mudar o conjunto de caracteres. Faça um backup do banco antes, porque o ALTER TABLE altera a estrutura e converte os valores das colunas. O comando do manual para mudar o padrão da tabela e converter todas as colunas de texto (CHAR, VARCHAR, TEXT) é:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Aplicado à tabela de exemplo, montado com as opções documentadas:
ALTER TABLE minha_tabela CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
Se você não indicar a collation, o comando usa a padrão do conjunto de caracteres. Alguns avisos importantes do manual:
- Tipos podem mudar: uma coluna
TEXTpode virarMEDIUMTEXT, e umaVARCHARtambém. Para evitar isso, o manual manda não usarCONVERT TOe mudar cada coluna comMODIFY, por exemploALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8mb4;. - Chave estrangeira: com
foreign_key_checksligada, que é o padrão, a conversão não é permitida em tabela com coluna de texto usada numa chave estrangeira. O guia Erro 1452 MySQL: foreign key constraint, como resolver ajuda a entender essas chaves. - Tamanho de índice: o limite em bytes não muda, então em caracteres ele diminui, pois cada caractere passa a ter até quatro bytes em vez de três.
- Dado gravado no conjunto errado: o
CONVERT TOconverte os valores entre o conjunto original e o novo. Isso não serve quando o conjunto declarado é um, mas os valores guardados usam outro, incompatível. O manual trata esse caso à parte; como é avançado, faça backup e siga a página dele.
Para o banco, a sintaxe documentada é ALTER DATABASE minha_base CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;, composta das opções do manual. A página diz que a opção CHARACTER SET muda o conjunto padrão do banco. Para a tabela que já existe, o comando documentado para converter é o ALTER TABLE acima.
Diferença entre o 1366 e o 1406
Na referência do MySQL 8.4, as mensagens são diferentes:
- 1366:
Incorrect %s value: '%s' for column '%s' at row %ld, o valor é incorreto para a coluna. - 1406:
Data too long for column '%s' at row %ld(SQLSTATE22001), o dado é longo demais para a coluna.
A referência não explica as diferenças; pela leitura das mensagens, o 1366 fala de conteúdo ou tipo inválido e o 1406 fala de tamanho. Se a mensagem fala de coluna que não existe, veja o guia Erro 1054 MySQL: Unknown column, como resolver; se fala de banco inexistente, o Erro 1049 MySQL: Unknown database, como resolver.
Checklist do erro 1366
- Leia a mensagem: o tipo (string ou integer), o valor recusado, a coluna e a linha.
- Rode
SHOW CREATE TABLEeSHOW FULL COLUMNSpara ver o conjunto de caracteres e a collation da coluna. - Se o valor tem caracteres suplementares (como muitos emojis) e a coluna é utf8mb3, o utf8mb4 é a correção.
- Lembre que
utf8é apelido de utf8mb3, e não de utf8mb4. - Veja a sessão com
SHOW SESSION VARIABLES LIKE 'character\_set\_%';e acerte comSET NAMES 'utf8mb4';. - Se o valor é texto numa coluna numérica, corrija o dado enviado.
- Não desligue o modo estrito para esconder o erro: o dado seria ajustado ou perdido.
- Antes de converter, faça backup. Depois, use
ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4e confira se algumTEXTvirouMEDIUMTEXT. - Não confunda com o 1406, que fala de dado longo demais.
Quer ver as opções de VPS da Eleven Host? VPS a partir de R$ 17,00/mês no Plano Bronze; confira na loja o que cada plano inclui. Ver os planos de VPS
Perguntas frequentes
O que significa o erro 1366 no MySQL?
Significa que o valor enviado é incorreto para a coluna citada. O símbolo é ER_TRUNCATED_WRONG_VALUE_FOR_FIELD e o SQLSTATE é HY000.
Por que o Incorrect string value pode aparecer com emoji?
Muitos emojis são caracteres suplementares. Segundo o manual, o utf8mb4 guarda um caractere suplementar em quatro bytes e o utf8mb3 não consegue guardá-lo.
Posso desligar o modo estrito para o erro sumir?
Não resolve o problema. Sem o modo estrito, o erro vira aviso e o servidor grava um valor ajustado; no exemplo do manual, 'abc' vira 0.
O CONVERT TO muda o tipo das colunas?
Pode mudar. O manual avisa que uma coluna TEXT pode virar MEDIUMTEXT; para evitar, use MODIFY em cada coluna.