Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

java.sql.SQLException:Valor de string incorreto:'\xF0\x9F\x91\xBD\xF0\x9F...'


O que você tem é EXTRATERRESTRIAL ALIEN (U+1F47D) e BROKEN HEART (U+1F494) que não estão no plano multilíngue básico. Eles não podem ser representados em java como um caractere, "👽💔".length() ==4 . Eles definitivamente não são caracteres nulos e você verá quadrados se você não estiver usando fontes que os suportem.

utf8 do MySQL suporta apenas plano multilíngue básico e você precisa usar utf8mb4 em vez disso :

Para um caractere suplementar, o utf8 não pode armazenar o caractere, enquanto o utf8mb4 requer quatro bytes para armazená-lo. Como o utf8 não pode armazenar o caractere, você não tem nenhum caractere suplementar nas colunas utf8 e não precisa se preocupar em converter caracteres ou perder dados ao atualizar dados utf8 de versões mais antigas do MySQL.

Então, para suportar esses caracteres, seu MySQL precisa ser 5.5+ e você precisa usar utf8mb4 em toda parte. A codificação de conexão precisa ser utf8mb4 , o conjunto de caracteres precisa ser utf8mb4 e a ordenação precisa ser utf8mb4 . Para java ainda é apenas "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:
SET NAMES 'utf8mb4'

Logo após fazer a conexão.

Veja também isto para Connector/J :

14.14:Como posso usar UTF8 de 4 bytes, utf8mb4 com Connector/J?

Para usar UTF8 de 4 bytes com Connector/J, configure o servidor MySQL comcharacter_set_server=utf8mb4. Connector/J usará essa configuraçãodesde que characterEncoding não foi definido na connectionstring . Isso é equivalente à detecção automática do conjunto de caracteres.

Ajuste suas colunas e banco de dados também:
var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

Novamente, sua versão do MySQL precisa estar relativamente atualizada para suporte a utf8mb4.