una tipo insertar ingresar hora guardar fecha desde como agregar mysql jdbc utf-8 utf8mb4

tipo - insertar jdatechooser en mysql



"Valor de cadena incorrecto" al intentar insertar UTF-8 en MySQL a través de JDBC? (11)

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 cuando tyring para 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 obtengo 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?


El utf8 de MySQL solo permite los caracteres Unicode que pueden representarse con 3 bytes en UTF-8. Aquí tienes un personaje que necesita 4 bytes: / xF0 / x90 / x8D / x83 ( U + 10343 GETHIC LETTER SAUIL ).

Si tiene MySQL 5.5 o posterior, puede cambiar la codificación de la columna de utf8 a utf8mb4 . Esta codificación permite el almacenamiento de caracteres que ocupan 4 bytes en UTF-8.

También puede tener que establecer la propiedad del servidor character_set_server en utf8mb4 en el archivo de configuración de MySQL. Parece que Connector / J por defecto es de 3 bytes Unicode de lo contrario :

Por ejemplo, para usar juegos de caracteres UTF-8 de 4 bytes con Connector / J, configure el servidor MySQL con character_set_server=utf8mb4 , y deje characterEncoding fuera de la cadena de conexión Connector / J. Connector / J detectará automáticamente la configuración UTF-8.


En mi caso, intenté todo lo anterior, nada funcionó. Estoy bastante seguro, mi base de datos se ve a continuación.

mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper Connection id: 12 Current database: xxx Current user: yo@localhost SSL: Not in use Current pager: stdout Using outfile: '''' Using delimiter: ; Server version: 5.7.17-0ubuntu0.16.04.1 (Ubuntu) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 42 min 49 sec Threads: 1 Questions: 372 Slow queries: 0 Opens: 166 Flush tables: 1 Open tables: 30 Queries per second avg: 0.144

entonces, busco el conjunto de caracteres de la columna en cada tabla

show create table company;

Resulta que el juego de caracteres de la columna es latino. Es por eso que no puedo insertar chino en la base de datos.

ALTER TABLE company CONVERT TO CHARACTER SET utf8;

Eso podría ayudarte. :)


Las cadenas que contienen /xF0 son simplemente caracteres codificados como bytes múltiples usando UTF-8.

Aunque su intercalación está configurada en utf8_general_ci, sospecho que la codificación de caracteres de la base de datos, tabla o incluso columna puede ser diferente. Son configuraciones independientes . Tratar:

ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

Sustituya cualquiera que sea su tipo de datos real para VARCHAR (255)


Quise combinar un par de publicaciones para hacer una respuesta completa, ya que parecen ser unos pocos pasos.

  1. Above advice by @madtracey

/etc/mysql/my.cnf o /etc/mysql/mysql.conf.d/mysqld.cnf

[mysql] default-character-set=utf8mb4 [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] ## character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect=''SET NAMES utf8mb4'' sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

De nuevo, por consejo, todas las conexiones jdbc tenían characterEncoding=UTF-8 y characterSetResults=UTF-8 eliminado de ellas

Con este conjunto -Dfile.encoding=UTF-8 pareció no hacer diferencia.

Todavía no podía escribir texto internacional en db obteniendo el mismo error que el anterior

Ahora usando this how-to-convert-an-entire-mysql-database-characterset-and-collation-to-utf-8

Actualiza todos tus archivos db para usar utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ejecute esta consulta que le proporciona lo que necesita ser llamado

SELECT CONCAT( ''ALTER TABLE '', table_name, '' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; '', ''ALTER TABLE '', table_name, '' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; '') FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C WHERE C.collation_name = T.table_collation AND T.table_schema = ''YOURDB'' AND (C.CHARACTER_SET_NAME != ''utf8mb4'' OR C.COLLATION_NAME not like ''utf8mb4%'')

Copiar y pegar resultados en el editor reemplazar todo | sin nada publicar de nuevo en mysql cuando se conecta a la base de datos correcta.

Eso es todo lo que tenía que hacerse y todo parece funcionar para mí. No el - Dfile.encoding=UTF-8 no está habilitado y parece funcionar como se esperaba

E2A ¿Todavía tienes un problema? Ciertamente estoy en producción, así que resulta necesario verificar lo que se ha hecho anteriormente, ya que a veces no funciona, aquí hay una razón y una solución en este escenario:

show create table user `password` varchar(255) CHARACTER SET latin1 NOT NULL, `username` varchar(255) CHARACTER SET latin1 NOT NULL,

Puedes ver que algunos todavía están latinos intentando actualizar manualmente el registro:

ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4; ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

Así que afinémoslo:

mysql> ALTER TABLE user change username username varchar(255) CHARACTER SET utf8mb4 not NULL; ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes mysql> ALTER TABLE user change username username varchar(100) CHARACTER SET utf8mb4 not NULL; Query OK, 5 rows affected (0.01 sec)

En resumen, tuve que reducir el tamaño de ese campo para que la actualización funcione.

Ahora cuando corro:

mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4; Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0

Todo funciona


Se debe principalmente a algunos caracteres Unicode. En mi caso, era el símbolo de la moneda Rupia.

Para solucionar esto rápidamente, tuve que detectar el personaje que causaba este error. Copié el texto completo pegado en un editor de texto como vi y reemplacé el personaje problemático con uno de texto.


Si solo quieres aplicar el cambio solo para un campo, podrías intentar serializar el campo

class MyModel < ActiveRecord::Base serialize :content attr_accessible :content, :title end


Tengo el mismo problema, para guardar los datos con utf8mb4 debe asegurarse de que:

  1. character_set_client, character_set_connection, character_set_results son utf8mb4 : character_set_client y character_set_connection indican 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 .

  2. la codificación de tabla y columna es utf8mb4

Para JDBC, hay dos soluciones:

Solución 1 (necesidad de reiniciar MySQL):

  1. modifique my.cnf como el siguiente y reinicie MySQL:

    [mysql] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci

esto puede asegurar que la base de datos y character_set_client, character_set_connection, character_set_results sean utf8mb4 por defecto.

  1. reiniciar MySQL

  2. cambie la codificación de tabla y columna a utf8mb4

  3. STOP especifica characterEncoding=UTF-8 y characterSetResults=UTF-8 en el conector jdbc, porque esto anulará character_set_client , character_set_connection , character_set_results a utf8

Solución dos (no es necesario reiniciar MySQL):

  1. cambie la codificación de tabla y columna a utf8mb4

  2. especificando characterEncoding=UTF-8 en el conector jdbc, porque el conector jdbc no utf8mb4 .

  3. escriba su declaración sql de esta manera (necesita agregar allowMultiQueries=true al conector jdbc):

    ''SET NAMES utf8mb4;INSERT INTO Mytable ...'';

esto asegurará que cada conexión al servidor, character_set_client,character_set_connection,character_set_results sean utf8mb4 .
Ver también charset-connection .


Tuve el mismo problema en mi proyecto de rieles:

Incorrect string value: ''/xF0/xA9/xB8/xBDs ...'' for column ''subject'' at row1

Solución 1: antes de guardar en db convert string a base64 por Base64.encode64(subject) y después de Base64.decode64(subject) de db use Base64.decode64(subject)

Solución 2:

Paso 1: Cambia el conjunto de caracteres (y colación) para la columna del tema por

ALTER TABLE t1 MODIFY subject VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Paso 2: en el uso de database.yml

encoding :utf8mb4


mi solución es cambiar el tipo de columna de varchar (255) a blob


para resolver este error, sigue estos pasos:

  1. phpMyAdmin
  2. tu mesa
  3. "Pestaña Estructura"
  4. cambie la colación de su campo de latin1_swedish_ci (o lo que sea) a utf8_general_ci

solo haz

ALTER TABLE `some_table` CHARACTER SET = utf8 , COLLATE = utf8_general_ci ; ALTER TABLE `some_table` CHANGE COLUMN `description_with_latin_or_something` `description` TEXT CHARACTER SET ''utf8'' NOT NULL ;