Tenho o seguinte valor de string: "walmart obama 👽💔"
Estou usando MySQL e Java.
Estou recebendo a seguinte exceção: `java.sql.SQLException: Valor de string incorreto: '\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F ...'
Aqui está a variável que estou tentando inserir:
var1 varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL`
Meu código Java que está tentando inserir "walmart obama 👽💔" é uma declaração preparada. Portanto, estou usando o setString()
método.
Parece que o problema é a codificação dos valores 👽💔. Como posso consertar isso? Anteriormente, eu estava usando Derby SQL e os valores 👽💔 acabaram sendo dois quadrados (acho que esta é a representação do caractere nulo)
Toda ajuda é bem-vinda!
java
mysql
encoding
character-encoding
sqlexception
CodeKingPlusPlus
fonte
fonte
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Respostas:
O que você tem
EXTRATERRESTRIAL ALIEN (U+1F47D)
e oBROKEN HEART (U+1F494)
que não está no plano multilíngue básico. Eles não podem ser representados em java como um char"👽💔".length() == 4
,. Eles definitivamente não são caracteres nulos e você verá quadrados se você não estiver usando fontes que os suportem.MySQL de
utf8
apenas suporta avião multilingual básico, e você precisa usarutf8mb4
em vez :Portanto, para suportar esses caracteres, seu MySQL precisa ser 5.5+ e você precisa usar em
utf8mb4
qualquer lugar. A codificação da conexão precisa serutf8mb4
, o conjunto de caracteres precisa serutf8mb4
e a colação precisa serutf8mb4
. Para java ainda é justo"utf-8"
, mas o MySQL precisa de uma distinção.Não sei qual driver você está usando, mas uma maneira agnóstica de driver para definir o conjunto de caracteres de conexão é enviar a consulta:
Logo após fazer a conexão.
Veja também para o Conector / J :
Ajuste suas colunas e banco de dados também:
Novamente, sua versão do MySQL precisa ser relativamente atualizada para suporte utf8mb4.
fonte
utf8mb4
, parece que ainda está usandoutf8_general_ci
..Do not issue the query set names with Connector/J, as the driver will not detect that the character set has changed, and will continue to use the character set detected during the initial connection setup.
Resumindo, para salvar símbolos que requerem 4 bytes, você precisa atualizar o conjunto de caracteres e o agrupamento para
utf8mb4
:alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci
No meu ambiente de desenvolvimento para o nº 2, prefiro definir parâmetros na linha de comando ao iniciar o servidor:
mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
btw, preste atenção ao comportamento do Conector / J com
SET NAMES 'utf8mb4'
:E evite definir o
characterEncoding
parâmetro no URL da conexão, pois isso substituirá a codificação do servidor configurada:fonte
Estranhamente, descobri que REMOVER
&characterEncoding=UTF-8
doJDBC url
fez o truque para mim com problemas semelhantes.Com base em minhas propriedades,
Eu acho que isso suporta o que @Esailija disse acima, ou seja, meu MySQL, que é de fato 5.5, está descobrindo seu próprio sabor favorito de codificação UTF-8.
(Observe, também estou especificando
InputStream
que estou lendo comoUTF-8
no código java, o que provavelmente não faz mal) ...fonte
useUnicode=true
nem seja necessário? No meu caso, a única coisa que funcionou foi definircharacter_set_server=utf8mb4
globalmente no servidor (grupo de parâmetros RDS) e NÃO ter nenhum characterEncoding na URL JDBC.Como resolvi meu problema.
eu tinha
No meu URL de conexão jdbc hibernate, alterei o tipo de dados da string para texto longo no banco de dados, que antes era varchar.
fonte
Anexe a linha
useUnicode=true&characterEncoding=UTF-8
ao seu url jdbc.No seu caso, os dados não estão sendo enviados por meio de
UTF-8
codificação.fonte
Enfrentei o mesmo problema e resolvi definindo o agrupamento como utf8_general_ci para cada coluna.
fonte
Eu acho que o MySQL não acredita que este seja um texto UTF8 válido. Eu tentei uma inserção em uma tabela de teste com a mesma definição de coluna (a conexão do cliente mysql também era UTF8) e embora tenha feito a inserção, os dados que eu recuperei com o cliente MySQL CLI, bem como JDBC, não recuperaram os valores corretamente. Para ter certeza de que o UTF8 funcionou corretamente, inseri um "ö" em vez de um "o" para obama:
Pequeno aplicativo java para testar:
Resultado:
Além disso, tentei a mesma inserção com a conexão JDBC e gerou a mesma exceção que você está obtendo. Acredito que seja um bug do MySQL. Talvez já haja um relatório de bug sobre tal situação ..
fonte
Eu tive o mesmo problema e depois de ir cuidadosamente contra todos os conjuntos de caracteres e descobrir que eles estavam corretos, percebi que a propriedade bugada que eu tinha em minha classe estava anotada como @Column em vez de @JoinColumn (javax.presistence; hibernate) e estava quebrando tudo.
fonte
executar
encontre o servidor de conjunto de caracteres se não for utf8mb4.
configure-o no seu my.cnf, como
adicione uma linha
finalmente reinicie o mysql
fonte
character_set_server
é a opção, NÃOcharacter-set-server
Essa configuração useOldUTF8Behavior = true funcionou bem para mim. Não deu erros de string incorretos, mas converteu caracteres especiais como à em vários caracteres e salvou no banco de dados.
Para evitar tais situações, removi esta propriedade do parâmetro JDBC e, em vez disso, converti o tipo de dados da minha coluna em BLOB. Isso funcionou perfeitamente.
fonte
Além disso, o tipo de dados pode usar a instalação de blob de varchar ou texto.
fonte