Así es como se establece mi conexión:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
Y obtengo el siguiente error al intentar agregar una fila a una tabla:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
Estoy insertando miles de registros, y siempre recibo este error cuando el texto contiene \ xF0 (es decir, el valor de cadena incorrecto siempre comienza con \ xF0).
La clasificación de la columna es utf8_general_ci.
¿Cual podría ser el problema?
Respuestas:
MySQL
utf8
solo permite los caracteres Unicode que se pueden representar con 3 bytes en UTF-8. Aquí tiene un carácter que necesita 4 bytes: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LETTER SAUIL ).Si tiene MySQL 5.5 o posterior, puede cambiar la codificación de columna de
utf8
autf8mb4
. Esta codificación permite el almacenamiento de caracteres que ocupan 4 bytes en UTF-8.Usted también puede tener que establecer la propiedad del servidor
character_set_server
queutf8mb4
en el archivo de configuración de MySQL. Parece que el conector / J por defecto es Unicode de 3 bytes : de lo contrario :fuente
character_encoding_server
es un nombre de variable de configuración MySQL válido. He intentado ajustarcharacter_set_server
autf8mb4
su lugar, además de columnas individuales, pero no cambiar nada.Las cadenas que contienen
\xF0
son simplemente caracteres codificados como bytes múltiples usando UTF-8.Aunque su intercalación está establecida en utf8_general_ci, sospecho que la codificación de caracteres de la base de datos, la tabla o incluso la columna puede ser diferente. Son configuraciones independientes . Tratar:
Sustituya cualquiera sea su tipo de datos real para VARCHAR (255)
fuente
file-encoding
parámetro que especifica UTF-8, por ejemplo,java -Dfile.encoding=UTF-8
o agregue un interruptor apropiado en su archivo de configuración de Tomcat (etc.).Tengo el mismo problema, para guardar los datos con
utf8mb4
necesidades, asegúrese de:character_set_client, character_set_connection, character_set_results
sonutf8mb4
:character_set_client
echaracter_set_connection
indica el conjunto de caracteres en el que el cliente envía las declaraciones,character_set_results
indica el conjunto de caracteres en el que el servidor devuelve los resultados de la consulta al cliente.Ver charset-connection .
la codificación de la tabla y la columna es
utf8mb4
Para JDBC, hay dos soluciones:
Solución 1 (necesita reiniciar MySQL):
modificar
my.cnf
como lo siguiente y reiniciar MySQL:Esto puede asegurar la base de datos y
character_set_client, character_set_connection, character_set_results
sonutf8mb4
por defecto.reiniciar MySQL
cambiar la codificación de la tabla y la columna a
utf8mb4
Interrumpir la definición
characterEncoding=UTF-8
ycharacterSetResults=UTF-8
en el conector JDBC, causar esto anularácharacter_set_client
,character_set_connection
,character_set_results
autf8
Solución dos (no es necesario reiniciar MySQL):
cambiar la codificación de la tabla y la columna a
utf8mb4
especificando
characterEncoding=UTF-8
en el conector jdbc, porque el conector jdbc no es compatibleutf8mb4
.escriba su declaración sql de esta manera (necesita agregar
allowMultiQueries=true
al conector jdbc):esto asegurará que cada conexión al servidor
character_set_client,character_set_connection,character_set_results
seautf8mb4
.Ver también charset-connection .
fuente
SELECT
consultas, yaset names utf8mb4; select ... from ...
que nunca produciráResultSet
unResultSet is from UPDATE. No Data.
error y, en su lugar, generará un error.Quería combinar un par de publicaciones para obtener una respuesta completa de esto, ya que parece ser unos pocos pasos.
/etc/mysql/my.cnf
o/etc/mysql/mysql.conf.d/mysqld.cnf
Nuevamente, por consejo sobre todas las conexiones jdbc tenían
characterEncoding=UTF-8
y secharacterSetResults=UTF-8
eliminaron de ellasCon este conjunto
-Dfile.encoding=UTF-8
parecía no hacer la diferencia.Todavía no podía escribir texto internacional en db obteniendo el mismo error que el anterior
Ahora usando este cómo-convertir-un-todo-mysql-database-characterset-and-collation-to-utf-8
Actualiza todos tus db para usar
utf8mb4
Ejecute esta consulta que le brinda lo que necesita sonar
Copiar pegar salida en editor reemplazar todo | sin nada publicado nuevamente en mysql cuando está conectado a la base de datos correcta.
Eso es todo lo que tenía que hacer y todo parece funcionar para mí. No el -
Dfile.encoding=UTF-8
no está habilitado y parece funcionar como se esperabaE2A ¿Sigue teniendo problemas? Ciertamente estoy en producción, así que resulta que debes verificar lo que se hizo anteriormente, ya que a veces no funciona, aquí hay una razón y una solución en este escenario:
Puede ver que algunos todavía son latinos intentando actualizar manualmente el registro:
Así que vamos a reducirlo:
En resumen, tuve que reducir el tamaño de ese campo para que la actualización funcionara.
Ahora cuando corro:
Todo funciona
fuente
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
suficientemente extraño cuando ejecuté esto la última vez, todos los campos ya no tenían un conjunto de caracteres definido. entonces la contraseña de arriba se convirtió enpassword
varchar (255) NOT NULL, (nada sobre codificación). Esto significa que el último comando simplemente debe haber hecho que mysql busque cuál era la definición real de la tabla y porque ahora la tabla era por defecto, los campos ya no la necesitan: supongo que permanecieron con el conjunto de caracteres simplemente porque durante el volcado de actualizaciones de la tabla completa no pudo actualizarlo y, por lo tanto, se dejó en ese estadoEn mi caso, probé todo lo anterior, nada funcionó. Estoy bastante seguro, mi base de datos se ve a continuación.
entonces, busco el juego de caracteres de la columna en cada tabla
Resulta que el juego de caracteres de la columna es latino. Es por eso que no puedo insertar chino en la base de datos.
Eso podría ayudarte. :)
fuente
Tuve el mismo problema en mi proyecto de rieles:
Solución 1: antes de guardar en db, convierta la cadena a base64 antes
Base64.encode64(subject)
y después de recuperar el uso de dbBase64.decode64(subject)
Solución 2:
Paso 1: cambie el conjunto de caracteres (y la clasificación) para la columna de asunto por
Paso 2: en database.yml use
fuente
solo haz
fuente
Suponiendo que está utilizando phpmyadmin para resolver este error, siga estos pasos:
latin1_swedish_ci
(o lo que sea) autf8_general_ci
fuente
Se debe principalmente a algunos caracteres unicode. En mi caso fue el símbolo de la moneda Rupia.
Para solucionar esto rápidamente, tuve que detectar el personaje que causaba este error. Copié y pegué todo el texto en un editor de texto como vi y reemplacé el carácter problemático por uno de texto.
fuente
Tuve este problema con mi aplicación PLAY Java. Este es mi seguimiento de pila para esa excepción:
Estaba tratando de guardar un registro usando io.Ebean. Lo arreglé al volver a crear mi base de datos con la clasificación utf8mb4, y apliqué play evolution para volver a crear todas las tablas de modo que todas las tablas deberían recrearse con la clasificación utf-8.
fuente
Si solo desea aplicar el cambio solo para un campo, puede intentar serializar el campo
fuente
Si está creando una nueva tabla MySQL, puede especificar el conjunto de caracteres de todas las columnas en el momento de la creación, y eso solucionó el problema para mí.
Puede leer más detalles: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html
fuente
Esta no es la solución recomendada. Pero vale la pena compartirla. Dado que mi proyecto es actualizar el DBMS del viejo Mysql al más nuevo (8). Pero no puedo cambiar la estructura de la tabla, solo la configuración DBMS (mysql). La solución para el servidor mysql.
prueba en Windows mysql 8.0.15 en mysql config search para
descomentarlo. O en mi caso simplemente escriba / agregue
¿Por qué no se recomienda la solución? porque si usas latin1 (mi caso) ... los datos se insertan con éxito pero no el contenido (¡mysql no responde con error!). por ejemplo, escribe información como esta
salva
está bien ... para mi problema ... puedo cambiar el campo a UTF8 ... Pero hay un pequeño problema ... ver arriba la respuesta sobre otra solución falló porque la palabra no está insertada porque contiene más de 2 bytes (cmiiw) ... esto La solución hace que sus datos de inserción se conviertan en caja. Lo razonable es usar blob ... y puedes saltarte mi respuesta.
Otra prueba relacionada con esto fue ... usar utf8_encode en su código antes de guardar. Lo uso en latin1 y fue un éxito (¡no estoy usando sql-mode )! igual que la respuesta anterior usando base64_encode .
Mi sugerencia para analizar el requisito de su tabla e intentó cambiar de otro formato a UTF8
fuente
mi solución es cambiar el tipo de columna de varchar (255) a blob
fuente
Debe configurar utf8mb4 en meta html y también en su servidor alter tabel y establecer la clasificación en utf8mb4
fuente
Sugerencia: en AWS RDS necesita un nuevo grupo de parámetros para su base de datos MySQL con los parámetros (en lugar de editar un my.cnf)
Nota: character_set_system permanece "utf8"
Estos comandos SQL NO FUNCIONAN PERMANENTEMENTE , solo en una sesión:
fuente
También tuve que soltar y volver a crear todos los procedimientos almacenados de la base de datos (y funciones también) para que se ejecuten dentro del nuevo conjunto de caracteres de utf8mb4.
Correr:
… Para ver qué procedimientos no se han actualizado a los nuevos valores de character_set_client, collation_connection y Database Collation del servidor.
fuente