sql >> Base de Datos >  >> RDS >> Mysql

java.sql.SQLException:valor de cadena incorrecto:'\xF0\x9F\x91\xBD\xF0\x9F...'

Lo que tienes es EXTRATERRESTRIAL ALIEN (U+1F47D) y BROKEN HEART (U+1F494) que no se encuentran en el plano plurilingüe básico. Ni siquiera se pueden representar en Java como un carácter, "👽💔".length() == 4 . Definitivamente no son caracteres nulos y uno verá cuadrados si no está usando fuentes que los admitan.

utf8 de MySQL solo es compatible con el plano multilingüe básico y debe usar utf8mb4 en cambio :

Para un carácter complementario, utf8 no puede almacenar el carácter en absoluto, mientras que utf8mb4 requiere cuatro bytes para almacenarlo. Dado que utf8 no puede almacenar ningún carácter, no tiene ningún carácter adicional en las columnas de utf8 y no debe preocuparse por convertir caracteres o perder datos al actualizar los datos de utf8 desde versiones anteriores de MySQL.

Entonces, para admitir estos caracteres, su MySQL debe ser 5.5+ y debe usar utf8mb4 En todas partes. La codificación de la conexión debe ser utf8mb4 , el conjunto de caracteres debe ser utf8mb4 y la recopilación debe ser utf8mb4 . Para java sigue siendo solo "utf-8" , pero MySQL necesita una distinción.

No sé qué controlador está utilizando, pero una forma agnóstica del controlador para configurar el juego de caracteres de conexión es enviar la consulta:

SET NAMES 'utf8mb4'

Inmediatamente después de hacer la conexión.

Vea también esto para Connector/J :

14.14:¿Cómo puedo usar UTF8 de 4 bytes, utf8mb4 con Connector/J?

Para usar UTF8 de 4 bytes con Connector/J configure el servidor MySQL concharacter_set_server=utf8mb4. Connector/J usará esa configuración siempre y cuando la codificación de caracteres no se ha establecido en la cadena de conexión . Esto es equivalente a la detección automática del juego de caracteres.

Ajuste sus columnas y base de datos también:

var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

Una vez más, su versión de MySQL debe estar relativamente actualizada para admitir utf8mb4.