Tengo el siguiente valor de cadena: "walmart obama 👽💔"
Estoy usando MySQL y Java.
Recibo la siguiente excepción: `java.sql.SQLException: Valor de cadena incorrecto: '\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F ...'
Aquí está la variable en la que estoy tratando de insertar:
var1 varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL`
Mi código Java que está intentando insertar "walmart obama 👽💔" es una declaración preparada. Entonces estoy usando el setString()
método.
Parece que el problema es la codificación de los valores 👽💔. ¿Cómo puedo arreglar esto? Anteriormente estaba usando Derby SQL y los valores 👽💔 simplemente terminaron siendo dos cuadrados (creo que esta es la representación del carácter nulo)
¡Toda ayuda es muy apreciada!
java
mysql
encoding
character-encoding
sqlexception
CodeKingPlusPlus
fuente
fuente
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Respuestas:
Lo que tienes es
EXTRATERRESTRIAL ALIEN (U+1F47D)
y loBROKEN 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 usarutf8mb4
en su lugar :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 serutf8mb4
, el conjunto de caracteres debe serutf8mb4
y la recopilación debe serutf8mb4
. 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:
Inmediatamente después de hacer la conexión.
Vea también esto para Connector / J :
Ajuste sus columnas y base de datos también:
Nuevamente, su versión de MySQL debe estar relativamente actualizada para la compatibilidad con utf8mb4.
fuente
utf8mb4
, parece que todavía 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.
En general, para guardar símbolos que requieren 4 bytes, debe actualizar el conjunto de caracteres y la colación para
utf8mb4
:alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci
En mi entorno de desarrollo para el n. ° 2, prefiero establecer parámetros en la línea de comandos al iniciar el servidor:
mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
Por cierto, preste atención al comportamiento del Conector / J con
SET NAMES 'utf8mb4'
:Y evite configurar el
characterEncoding
parámetro en la URL de conexión, ya que anulará la codificación del servidor configurado:fuente
Extrañamente, encontré que ELIMINAR
&characterEncoding=UTF-8
de laJDBC url
funcionó para mí con problemas similares.Basado en mis propiedades,
Creo que esto respalda lo que @Esailija ha dicho anteriormente, es decir, mi MySQL, que de hecho es 5.5, está descubriendo su propio sabor favorito de codificación UTF-8.
(Tenga en cuenta que también estoy especificando el
InputStream
que estoy leyendo comoUTF-8
en el código java, lo que probablemente no duele) ...fuente
useUnicode=true
ni siquiera es necesario? En mi caso, lo único que funcionó es la configuracióncharacter_set_server=utf8mb4
global en el servidor (grupo de parámetros RDS) y NO tener ninguna codificación de caracteres en la URL de JDBC.Cómo resolví mi problema.
yo tenía
En mi url de conexión jdbc de hibernación y cambié el tipo de datos de cadena a texto largo en la base de datos, que antes era varchar.
fuente
Agrega la línea
useUnicode=true&characterEncoding=UTF-8
a tu url jdbc.En su caso, los datos no se envían mediante
UTF-8
codificación.fuente
Me enfrenté al mismo problema y lo resolvió mediante el establecimiento de la intercalación de utf8_general_ci para cada columna.
fuente
Supongo que MySQL no cree que esto sea un texto UTF8 válido. Probé una inserción en una tabla de prueba con la misma definición de columna (la conexión del cliente mysql también era UTF8) y, aunque hizo la inserción, los datos que recuperé con el cliente CLI de MySQL y JDBC no recuperaron los valores correctamente. Para estar seguro de que UTF8 funcionó correctamente, inserté una "ö" en lugar de una "o" para obama:
Pequeña aplicación java para probar con:
Salida:
Además, probé la misma inserción con la conexión JDBC y arrojó la misma excepción que está obteniendo. Creo que esto es un error de MySQL. Tal vez ya haya un informe de error sobre tal situación ...
fuente
Tuve el mismo problema y después de ir con cuidado contra todos los conjuntos de caracteres y descubrir que estaban bien, me di cuenta de que la propiedad con errores que tenía en mi clase estaba anotada como @Column en lugar de @JoinColumn (javax.presistence; hibernate) y estaba rompiendo todo.
fuente
ejecutar
busque el servidor de conjunto de caracteres si no es utf8mb4.
configúrelo en su my.cnf, como
agregar una línea
por fin reiniciar mysql
fuente
character_set_server
es la opción, NOcharacter-set-server
Esta configuración useOldUTF8Behavior = true funcionó bien para mí. No dio errores de cadena incorrectos, pero convirtió caracteres especiales como à en varios caracteres y los guardó en la base de datos.
Para evitar tales situaciones, eliminé esta propiedad del parámetro JDBC y en su lugar convertí el tipo de datos de mi columna a BLOB. Esto funcionó perfecto.
fuente
Además, el tipo de datos puede usar blob install de varchar o text.
fuente