Lo que tienes es EXTRATERRESTRIAL ALIEN (U+1F47D)
y lo BROKEN HEART (U+1F494)
que no está en el plano multilingüe básico. Ni siquiera se pueden representar en Java como un solo carácter "👽💔".length() == 4
. Definitivamente no son caracteres nulos y se verán cuadrados si no está utilizando fuentes que los admitan.
MySQL utf8
solo admite el plano multilingüe básico, y debe usar utf8mb4
en su lugar :
Para un carácter suplementario, utf8 no puede almacenar el carácter en absoluto, mientras que utf8mb4 requiere cuatro bytes para almacenarlo. Dado que utf8 no puede almacenar el carácter en absoluto, no tiene caracteres suplementarios en las columnas utf8 y no necesita preocuparse por convertir caracteres o perder datos al actualizar los datos utf8 de versiones anteriores de MySQL.
Entonces, para admitir estos caracteres, su MySQL debe ser 5.5+ y debe usarlo en utf8mb4
todas partes. La codificación de conexión debe ser utf8mb4
, el conjunto de caracteres debe ser utf8mb4
y la recopilación debe ser utf8mb4
. Para Java sigue siendo justo "utf-8"
, pero MySQL necesita una distinción.
No sé qué controlador está utilizando, pero una forma independiente del controlador de 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, utf8mb4 de 4 bytes con Connector / J?
Para usar UTF8 de 4 bytes con Connector / J, configure el servidor MySQL con character_set_server = utf8mb4. El conector / J usará esa configuración
siempre que no se haya configurado characterEncoding en la cadena de conexión . Esto es equivalente a la autodetección 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
Nuevamente, su versión de MySQL debe estar relativamente actualizada para la compatibilidad con utf8mb4.