É assim que minha conexão é definida:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
E estou recebendo o seguinte erro ao tentar adicionar uma linha a uma tabela:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
Estou inserindo milhares de registros e sempre recebo esse erro quando o texto contém \ xF0 (ou seja, o valor incorreto da string sempre começa com \ xF0).
O agrupamento da coluna é utf8_general_ci.
Qual poderia ser o problema?
Respostas:
O MySQL
utf8
permite apenas os caracteres Unicode que podem ser representados com 3 bytes em UTF-8. Aqui você tem um caractere que precisa de 4 bytes: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LETTER SAUIL ).Se você possui o MySQL 5.5 ou posterior, pode alterar a codificação da coluna de
utf8
parautf8mb4
. Essa codificação permite o armazenamento de caracteres que ocupam 4 bytes em UTF-8.Você também pode ter que definir a propriedade do servidor
character_set_server
parautf8mb4
no arquivo de configuração do MySQL. Parece que o Connector / J assume como padrão o Unicode de 3 bytes, caso contrário :fonte
character_encoding_server
não é um nome válido de variável de configuração do MySQL. Tentei definircharacter_set_server
comoutf8mb4
alternativa, além de colunas individuais, mas não mudou nada.As cadeias que contêm
\xF0
são simplesmente caracteres codificados como vários bytes usando UTF-8.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. Eles são configurações independentes . Experimentar:
Substitua qualquer que seja o seu tipo de dados real por VARCHAR (255)
fonte
file-encoding
parâmetro que especifica UTF-8, por exemplo,java -Dfile.encoding=UTF-8
ou adicione uma opção apropriada no seu arquivo de configuração do Tomcat (etc.).Tem o mesmo problema, para salvar os dados com
utf8mb4
necessidades, verifique se:character_set_client, character_set_connection, character_set_results
sãoutf8mb4
:character_set_client
echaracter_set_connection
indica o conjunto de caracteres no qual as instruções são enviadas pelo cliente,character_set_results
indica o conjunto de caracteres no qual o servidor retorna os resultados da consulta ao cliente.Veja charset-connection .
a codificação de tabela e coluna é
utf8mb4
Para o JDBC, existem duas soluções:
Solução 1 (precisa reiniciar o MySQL):
modifique
my.cnf
da seguinte maneira e reinicie o MySQL:isso pode garantir que o banco de dados
character_set_client, character_set_connection, character_set_results
estejautf8mb4
por padrão.reinicie o MySQL
altere a codificação de tabela e coluna para
utf8mb4
PARAR especificando
characterEncoding=UTF-8
echaracterSetResults=UTF-8
no conector jdbc, causar este irá substituircharacter_set_client
,character_set_connection
,character_set_results
autf8
Solução dois (não precisa reiniciar o MySQL):
altere a codificação de tabela e coluna para
utf8mb4
especificando
characterEncoding=UTF-8
no conector jdbc, porque o conector jdbc não suportautf8mb4
.escreva sua declaração sql como esta (precisa adicionar
allowMultiQueries=true
ao conector jdbc):isso garantirá que cada conexão ao servidor
character_set_client,character_set_connection,character_set_results
sejautf8mb4
.Veja também charset-connection .
fonte
SELECT
consultas, poisset names utf8mb4; select ... from ...
nunca produzirá umResultSet
e, em vez disso, resultará em umResultSet is from UPDATE. No Data.
erro.Eu queria combinar algumas postagens para obter uma resposta completa disso, pois parece haver algumas etapas.
/etc/mysql/my.cnf
ou/etc/mysql/mysql.conf.d/mysqld.cnf
Novamente dos conselhos acima de todas as conexões jdbc tiveram
characterEncoding=UTF-8
e foramcharacterSetResults=UTF-8
removidasCom este conjunto
-Dfile.encoding=UTF-8
parecia não fazer diferença.Ainda não consegui escrever texto internacional em db, obtendo o mesmo erro acima
Agora, usando este como converter um conjunto de caracteres mysql-banco de dados-conjunto de caracteres e agrupamento em utf-8
Atualize todo o seu db para usar
utf8mb4
Execute esta consulta que fornece o que precisa ser tocado
Copiar e colar saída no editor substituir todos | com nada poste de volta no mysql quando conectado para corrigir db.
Isso é tudo o que precisava ser feito e tudo parece funcionar para mim. Não o -
Dfile.encoding=UTF-8
não está ativado e parece funcionar conforme o esperadoE2A Ainda está com algum problema? Eu certamente estou em produção, então você precisa verificar o que foi feito acima, pois às vezes não funciona, aqui está a razão e a correção neste cenário:
Você pode ver que alguns ainda estão tentando atualizar o registro manualmente:
Então, vamos reduzi-lo:
Em resumo, tive que reduzir o tamanho desse campo para que a atualização funcionasse.
Agora, quando eu corro:
Tudo funciona
fonte
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
estranhamente quando eu executei isso na última vez, todos os campos não tinham mais um conjunto de caracteres definido. então a senha de cima se tornoupassword
varchar (255) NOT NULL, (nada sobre codificação). Isso significa que o último comando simplesmente deve ter feito pesquisa no mysql qual era a definição real da tabela e, como agora a tabela era por padrão, os campos não precisam mais dela - presumo que eles permaneceram com o conjunto de caracteres simplesmente porque durante o despejo de atualizações de tabela inteiras não poderia atualizá-lo e, portanto, ele foi deixado naquele estadoNo meu caso, tentei de tudo acima, nada funcionou. Tenho certeza de que meu banco de dados se parece abaixo.
então, procuro o conjunto de colunas em todas as tabelas
Acontece que o conjunto de colunas é latino. Por isso, não consigo inserir chinês no banco de dados.
Isso pode ajudá-lo. :)
fonte
Eu tive o mesmo problema no meu projeto de trilhos:
Solução 1: antes de salvar em db, converta a string em base64
Base64.encode64(subject)
e depois da busca no db useBase64.decode64(subject)
Solução 2:
Etapa 1: altere o conjunto de caracteres (e agrupamento) da coluna de assunto por
Etapa 2: No database.yml, use
fonte
apenas faça
fonte
Supondo que você esteja usando o phpmyadmin para resolver esse erro, siga estas etapas:
latin1_swedish_ci
(ou o que for) parautf8_general_ci
fonte
É causada principalmente devido a alguns caracteres unicode. No meu caso, era o símbolo da moeda da Rúpia.
Para corrigir isso rapidamente, tive que identificar o personagem que causava esse erro. Copiei colei o texto inteiro em um editor de texto como o vi e substitui o caractere problemático por um texto.
fonte
Eu tive esse problema com meu aplicativo Java PLAY. Este é o meu rastreamento de pilha para essa exceção:
Eu estava tentando salvar um registro usando io.Ebean. Corrigi-o recriando meu banco de dados com o agrupamento utf8mb4 e apliquei o play evolution para recriar todas as tabelas, para que todas as tabelas fossem recriadas com o agrupamento utf-8.
fonte
Se você deseja aplicar a alteração apenas a um campo, tente serializar o campo
fonte
Se você estiver criando uma nova tabela MySQL, poderá especificar o conjunto de caracteres de todas as colunas na criação, e isso resolveu o problema para mim.
Você pode ler mais detalhes: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html
fonte
Esta não é a solução de recomendação. Mas vale a pena compartilhar. Desde que meu projeto está atualizando o DBMS do antigo Mysql para o mais novo (8). Mas não consigo alterar a estrutura da tabela, apenas a configuração do DBMS (mysql). A solução para o servidor mysql.
teste on do Windows mysql 8.0.15 no mysql configuração pesquisa
descomente. Ou, no meu caso, basta digitar / adicionar
por que não solução recomendada. porque se você usa latin1 (meu caso) .. os dados são inseridos com sucesso mas não o conteúdo (mysql não responde com erro !!). por exemplo, você digita informações como esta
isso salva
ok .. para o meu problema .. posso alterar o campo para UTF8 .. mas há um pequeno problema .. veja acima a resposta sobre outra solução falhou porque a palavra não foi inserida porque contém mais de 2 bytes (cmiiw) .. isso solução faça com que seus dados de inserção se tornem caixa. O razoável é usar blob .. e você pode pular minha resposta.
Outro teste relacionado a isso foi .. usando utf8_encode no seu código antes de salvar. Eu uso no latin1 e foi um sucesso (não estou usando o modo sql )! o mesmo que a resposta acima usando base64_encode .
Minha sugestão para analisar seu requisito de tabela e tentei mudar de outro formato para UTF8
fonte
minha solução é alterar o tipo de coluna de varchar (255) para blob
fonte
Você precisa definir utf8mb4 no meta html e também no servidor, alterar o rótulo e definir agrupamento para utf8mb4
fonte
Dica: No AWS RDS, você precisa de um novo Grupo de Parâmetros para o seu MySQL DB com os parâmetros (em vez de editar um my.cnf)
Nota: character_set_system permanece "utf8"
Esses comandos SQL NÃO FUNCIONAM PERMANENTEMENTE - apenas em uma sessão:
fonte
Também tive que eliminar e recriar todos os procedimentos armazenados do banco de dados (e também funções) para que eles sejam executados no novo conjunto de caracteres utf8mb4.
Corre:
… Para ver quais procedimentos não foram atualizados para os novos valores character_set_client, collation_connection e Database Collation do servidor.
fonte