Base de Conhecimento

Erro 1366 MySQL: Incorrect string value, como resolver

  • mysql, erro 1366, incorrect string value, utf8mb4, charset
  • Usuários acharam útil: 0

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

Arte da Eleven Host: janela de terminal com o título: Erro 1366 MySQL: Incorrect string value, como resolver

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 de character_set_client para 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 TEXT pode virar MEDIUMTEXT, e uma VARCHAR também. Para evitar isso, o manual manda não usar CONVERT TO e mudar cada coluna com MODIFY, por exemplo ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8mb4;.
  • Chave estrangeira: com foreign_key_checks ligada, 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 TO converte 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 (SQLSTATE 22001), 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 TABLE e SHOW FULL COLUMNS para 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 com SET 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 utf8mb4 e confira se algum TEXT virou MEDIUMTEXT.
  • 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.

Esta resposta lhe foi útil?

Artigos Relacionados