Depois de perceber que um aplicativo tendia a descartar emails aleatórios devido a erros incorretos no valor da string, eu fui embora e troquei muitas colunas de texto para usar o utf8
charset de coluna e a coluna padrão collate ( utf8_general_ci
) para aceitá-las. Isso corrigiu a maioria dos erros e fez com que o aplicativo parasse de receber erros de sql ao acessar e-mails não latinos também.
Apesar disso, alguns dos e-mails ainda estão fazendo com que o programa atinja erros incorretos no valor da string: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)
A coluna de conteúdo é um MEDIUMTEXT
dado que usa o conjunto de utf8
caracteres da utf8_general_ci
coluna e a coluna é agrupada . Não há sinalizadores que eu possa alternar nesta coluna.
Lembre-se de que não quero tocar nem olhar o código-fonte do aplicativo, a menos que seja absolutamente necessário:
- O que está causando esse erro? (sim, eu sei que os e-mails estão cheios de lixo aleatório, mas achei que o utf8 seria bastante permissivo)
- Como posso corrigir isso?
- Quais são os efeitos prováveis dessa correção?
Uma coisa que considerei foi mudar para um utchar8 varchar ([algum número grande]) com o sinalizador binário ativado, mas não estou familiarizado com o MySQL e não tenho idéia se essa correção faz sentido.
Respostas:
"\xE4\xC5\xCC\xC9\xD3\xD8"
não é válido UTF-8. Testado usando Python:Se você estiver procurando uma maneira de evitar erros de decodificação no banco de dados, a codificação cp1252 (também conhecida como "Windows-1252" ou "Windows Western European") é a codificação mais permissiva que existe - todo valor de byte é um ponto de código válido.
É claro que ele não entenderá mais o UTF-8 genuíno, nem qualquer outra codificação não cp1252, mas parece que você não está muito preocupado com isso?
fonte
café
, isso vai interpretar mal issocafé
. Não irá falhar, mas não entenderá os caracteres mais importantes.Eu não sugeriria resposta Richies, porque você está estragando os dados dentro do banco de dados. Você não solucionaria o problema, mas tentaria "ocultá-lo" e não conseguir executar operações essenciais do banco de dados com os dados ocultos.
Se você encontrar esse erro, os dados que você está enviando não são codificados em UTF-8 ou sua conexão não é UTF-8. Primeiro, verifique se a fonte de dados (um arquivo, ...) realmente é UTF-8.
Em seguida, verifique sua conexão com o banco de dados, você deve fazer isso depois de conectar:
Em seguida, verifique se as tabelas em que os dados estão armazenados têm o conjunto de caracteres utf8:
Por fim, verifique as configurações do banco de dados:
Se a origem, o transporte e o destino forem UTF-8, seu problema desapareceu;)
fonte
SET CHARACTER SET utf8
(não character_set)Os tipos utf-8 do MySQL não são realmente adequados utf-8 - ele usa apenas até três bytes por caractere e suporta apenas o Plano Multilíngue Básico (ou seja, sem Emoji, sem plano astral, etc.).
Se você precisar armazenar valores de planos Unicode superiores, precisará das codificações utf8mb4 .
fonte
A tabela e os campos têm a codificação incorreta; no entanto, você pode convertê-los em UTF-8.
fonte
Resolvi esse problema hoje alterando a coluna para o tipo 'LONGBLOB', que armazena bytes não processados em vez de caracteres UTF-8.
A única desvantagem de fazer isso é que você deve cuidar da codificação. Se um cliente do seu aplicativo usa codificação UTF-8 e outro usa o CP1252, seus e-mails podem ser enviados com caracteres incorretos. Para evitar isso, sempre use a mesma codificação (por exemplo, UTF-8) em todos os seus aplicativos .
Consulte esta página http://dev.mysql.com/doc/refman/5.0/en/blob.html para obter mais detalhes das diferenças entre TEXT / LONGTEXT e BLOB / LONGBLOB. Também existem muitos outros argumentos na web discutindo esses dois.
fonte
Primeiro verifique se o seu default_character_set_name é utf8.
Se o resultado não for utf8, você deve converter seu banco de dados. Primeiro, você deve salvar um despejo.
Para alterar o conjunto de caracteres que codifica para UTF-8 para todas as tabelas no banco de dados especificado, digite o seguinte comando na linha de comandos. Substitua DBNAME pelo nome do banco de dados:
Para alterar o conjunto de caracteres que codifica para UTF-8 para o próprio banco de dados, digite o seguinte comando no prompt mysql >. Substitua DBNAME pelo nome do banco de dados:
Agora você pode tentar escrever novamente o caractere utf8 no seu banco de dados. Esta solução me ajuda quando tento fazer upload de 200000 linhas de arquivos csv no meu banco de dados.
fonte
Em geral, isso acontece quando você insere seqüências de caracteres em colunas com codificação / agrupamento incompatível.
Eu recebi esse erro quando tinha TRIGGERs, que herdam o agrupamento do servidor por algum motivo. E o padrão do mysql é (pelo menos no Ubuntu) latin-1 com agrupamento sueco. Mesmo tendo o banco de dados e todas as tabelas definidas como UTF-8, ainda não havia definido
my.cnf
:/etc/mysql/my.cnf:
E isso deve listar todos os gatilhos com utf8- *:
E algumas das variáveis listadas por isso também devem ter utf-8- * (sem latin-1 ou outra codificação):
fonte
Embora seu agrupamento esteja definido como utf8_general_ci, suspeito que a codificação de caracteres do banco de dados, tabela ou mesmo coluna possa ser diferente.
fonte
Eu recebi um erro semelhante (
Incorrect string value: '\xD0\xBE\xDO\xB2. ...' for 'content' at row 1
). Eu tentei alterar o conjunto de caracteres da coluna parautf8mb4
e depois que o erro foi alterado para'Data too long for column 'content' at row 1'
.Acontece que o mysql me mostra um erro errado. Voltei o conjunto de caracteres da coluna para
utf8
e alterei o tipo da coluna paraMEDIUMTEXT
. Depois disso, o erro desapareceu.Eu espero que isso ajude alguém.
By the way MariaDB no mesmo caso (eu testei o mesmo INSERT lá) apenas cortar um texto sem erro.
fonte
Esse erro significa que você tem a string com codificação incorreta (por exemplo, está tentando inserir uma string codificada ISO-8859-1 na coluna codificada UTF-8) ou a coluna não suporta os dados que você está tentando inserir.
Na prática, o último problema é causado pela implementação do MySQL UTF-8 que suporta apenas caracteres UNICODE que precisam de 1 a 3 bytes quando representados no UTF-8. Veja "Valor incorreto da string" ao tentar inserir UTF-8 no MySQL via JDBC? para detalhes.
fonte
A solução para mim ao executar esse valor incorreto de string: '\ xF8' para erro de coluna usando scriptcase era garantir que meu banco de dados esteja configurado para utf8 general ci, assim como meus agrupamentos de campos. Então, quando faço a importação de dados de um arquivo csv, carrego o csv no UE Studio e salve-o no formato utf8 e Voila! Funciona como um encanto, 29000 registros, sem erros. Anteriormente, eu estava tentando importar um CSV criado pelo Excel.
fonte
Eu tentei todas as soluções acima (que trazem pontos válidos), mas nada estava funcionando para mim.
Até descobrir que meus mapeamentos de campo da tabela MySQL em C # estavam usando um tipo incorreto: MySqlDbType.Blob . Eu mudei para MySqlDbType.Text e agora posso escrever todos os símbolos UTF8 que eu quiser!
ps Meu campo de tabela MySQL é do tipo "LongText". No entanto, quando eu gerei automaticamente os mapeamentos de campo usando o software MyGeneration, ele definiu automaticamente o tipo de campo como MySqlDbType.Blob em C #.
Curiosamente, eu tenho usado o tipo MySqlDbType.Blob com caracteres UTF8 por muitos meses sem problemas, até que um dia tentei escrever uma string com alguns caracteres específicos.
Espero que isso ajude alguém que está lutando para encontrar uma razão para o erro.
fonte
Eu adicionei binário antes do nome da coluna e resolvo o erro do conjunto de caracteres.
insere nos valores da tabelaA (string binária nome do arquivo1);
fonte
Oi eu também tenho esse erro quando eu uso meus bancos de dados on-line do servidor godaddy eu acho que tem a versão mysql de 5.1 ou mais. mas quando eu faço do meu servidor localhost (versão 5.7), tudo bem depois que eu criei a tabela do servidor local e copiei para o servidor online usando o mysql yog, acho que o problema está no conjunto de caracteres
Captura de tela aqui
fonte
Para corrigir esse erro, atualizei meu banco de dados MySQL para utf8mb4, que suporta o conjunto completo de caracteres Unicode, seguindo este tutorial detalhado . Sugiro analisá-lo com cuidado, porque existem algumas dicas (por exemplo, as chaves de índice podem se tornar muito grandes devido às novas codificações após as quais é necessário modificar os tipos de campo).
fonte
Há boas respostas aqui. Estou adicionando o meu desde que encontrei o mesmo erro, mas acabou sendo um problema completamente diferente. (Talvez na superfície o mesmo, mas uma causa raiz diferente.)
Para mim, o erro ocorreu no seguinte campo:
Isso acaba sendo armazenado no banco de dados como uma serialização binária da
URI
classe. Isso não gerou nenhum sinalizador nos testes de unidade (usando H2) ou CI / integração (usando MariaDB4j ), explodiu em nossa configuração de produção. (Embora, uma vez que o problema tenha sido entendido, fosse fácil ver o valor errado na instância MariaDB4j; ele simplesmente não explodiu o teste.) A solução foi criar um mapeador de tipo personalizado:Utilizado da seguinte forma:
No que diz respeito ao Hibernate, parece que ele possui vários mapeadores de tipos fornecidos , incluindo for
java.net.URL
, mas não forjava.net.URI
(que é o que precisávamos aqui).fonte
No meu caso, esse problema foi resolvido alterando a codificação da coluna Mysql para 'binário' (o tipo de dados será alterado automaticamente para VARBINARY). Provavelmente não poderei filtrar ou pesquisar com essa coluna, mas não preciso disso.
fonte
Se você processar o valor com alguma função de string antes de salvar, verifique se a função pode manipular adequadamente caracteres multibyte. As funções de sequência que não podem fazer isso e estão tentando, por exemplo, truncar podem dividir um dos caracteres multibyte únicos no meio e isso pode causar situações de erro de sequência.
No PHP, por exemplo, você precisaria mudar de
substr
paramb_substr
.fonte
No meu caso, primeiro encontrei um '???' no meu site, então verifico o conjunto de caracteres do Mysql, que agora é latino, então mudo para utf-8, reinicio meu projeto, recebo o mesmo erro com você e descobri que esqueci de alterar o conjunto de caracteres do banco de dados e mude para utf-8, boom, funcionou.
fonte
Eu tentei quase todos os passos mencionados aqui. Nenhum funcionou. Mariadb baixado. Funcionou. Sei que essa não é uma solução, mas isso pode ajudar alguém a identificar o problema rapidamente ou fornecer uma solução temporária.
fonte
No meu caso,
Incorrect string value: '\xCC\x88'...
o problema era que um o-trema estava em seu estado decomposto. Essa pergunta e resposta me ajudaram a entender a diferença entreo¨
eö
. No PHP, a correção para mim foi usar a biblioteca Normalizer do PHP . Por exemploNormalizer::normalize('o¨', Normalizer::FORM_C)
,.fonte
1 - Você deve declarar em sua conexão a propriedade de acondicionar UTF8. http://php.net/manual/en/mysqli.set-charset.php .
2 - Se você estiver usando a linha de comando mysql para executar um script, use a flag, como:
Cmd: C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:\wamp64\www\PontoEletronico\PE10002Corporacao\BancoDeDadosModelo\omega_empresa_parametros.sql
fonte