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 dejecharacterEncoding
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.
- 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:
character_set_client, character_set_connection, character_set_results
sonutf8mb4
:character_set_client
ycharacter_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 .la codificación de tabla y columna es
utf8mb4
Para JDBC, hay dos soluciones:
Solución 1 (necesidad de reiniciar MySQL):
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.
reiniciar MySQL
cambie la codificación de tabla y columna a
utf8mb4
STOP especifica
characterEncoding=UTF-8
ycharacterSetResults=UTF-8
en el conector jdbc, porque esto anularácharacter_set_client
,character_set_connection
,character_set_results
autf8
Solución dos (no es necesario reiniciar MySQL):
cambie la codificación de tabla y columna a
utf8mb4
especificando
characterEncoding=UTF-8
en el conector jdbc, porque el conector jdbc noutf8mb4
.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:
- phpMyAdmin
- tu mesa
- "Pestaña Estructura"
- cambie la colación de su campo de
latin1_swedish_ci
(o lo que sea) autf8_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 ;