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

228

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?

Lior
fuente
Eso sería LETRA N MINÚSCULA LATINA CON TILDE (ñ).
andreszs
Para otros que encuentren este problema, puede intentar: En la base de datos: ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - Resolverá las tablas creadas "a partir de ahora". NO para tablas EXIST. Para ellos, debe hacer: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Fuente - digitalocean.com/community/questions/…
lingar

Respuestas:

321

MySQL utf8solo 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 utf8a utf8mb4. 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_serverque utf8mb4en el archivo de configuración de MySQL. Parece que el conector / J por defecto es Unicode de 3 bytes : 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 characterEncodingfuera de la cadena de conexión Connector / J. Connector / J detectará automáticamente la configuración UTF-8.

Joni
fuente
151
Qué extraña elección tener utf8 realmente significa "el subconjunto de UTF8 que se puede representar en 3 bytes".
Eric J.
44
character_encoding_serveres un nombre de variable de configuración MySQL válido. He intentado ajustar character_set_servera utf8mb4su lugar, además de columnas individuales, pero no cambiar nada.
Romain Paulus
20
# Para cada base de datos: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # Para cada tabla: ALTER TABLE table_name CONVERTIR AL CARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # Para cada columna: ALTER TABLE table_name CHANGE column_name column_name VARCHAR (191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
iKing
14
Extraño que UTF-8 no sea UTF-8 hasta que se actualice para ser UTF-8
Klors
3
¿Está sugiriendo que UTF-8 con 3 (tres) bytes no puede almacenar LETRA N MINÚSCULA LATINA CON TILDE (ñ), y necesitamos 4 (cuatro) bytes para deletrear "España" correctamente? De Verdad? ¿Podría ser más ineficiente que esto? ¿Qué podemos almacenar además de AZ y 0-9 con 3 bytes entonces ..
Andreszs
95

Las cadenas que contienen \xF0son 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:

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

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

Eric J.
fuente
44
En realidad lo intenté, no funcionó. El tipo de datos de la columna es LONGTEXT por cierto, si esto es importante.
Lior
1
Tu aplicación está en Java ¿La tomo? Intente invocar Java con el file-encodingparámetro que especifica UTF-8, por ejemplo, java -Dfile.encoding=UTF-8o agregue un interruptor apropiado en su archivo de configuración de Tomcat (etc.).
Eric J.
1
Le sugiero que ponga énfasis en "la codificación de caracteres de la base de datos, la tabla o incluso la columna puede ser diferente" . Esa es la cosa mas importante.
Gellie Ann
También deberá modificar la tabla con CHARACTER SET utf8 COLLATE utf8_general_ci y luego, después de cambiar la columna CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
Shobhit Sharma
68

Tengo el mismo problema, para guardar los datos con utf8mb4necesidades, asegúrese de:

  1. character_set_client, character_set_connection, character_set_resultsson utf8mb4: character_set_cliente character_set_connectionindica el conjunto de caracteres en el que el cliente envía las declaraciones, character_set_resultsindica 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 la tabla y la columna es utf8mb4

Para JDBC, hay dos soluciones:

Solución 1 (necesita reiniciar MySQL):

  1. modificar my.cnfcomo lo siguiente y reiniciar MySQL:

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

Esto puede asegurar la base de datos y character_set_client, character_set_connection, character_set_resultsson utf8mb4por defecto.

  1. reiniciar MySQL

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

  3. Interrumpir la definición characterEncoding=UTF-8y characterSetResults=UTF-8en el conector JDBC, causar esto anulará character_set_client, character_set_connection, character_set_resultsautf8

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

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

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

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

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

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

locura
fuente
3
El punto 3 fue el factor decisivo para mí junto con el cambio de las codificaciones db, table & field: 'SET NAMES utf8mb4; INSERT INTO Mytable ...';
kbbucks
El punto 3 también me sirvió, la codificación de mi tabla ya estaba en utf8mb4.
Sir_Faenor
La codificación de la tabla es solo un valor predeterminado. Es suficiente cambiar la codificación de la columna a utf8mb4.
Rick James
El segundo enfoque debe usarse de forma selectiva, es decir, nunca debe aplicarse a las SELECTconsultas, ya set names utf8mb4; select ... from ...que nunca producirá ResultSetun ResultSet is from UPDATE. No Data.error y, en su lugar, generará un error.
Bass
solución 2, solo par. Me ayudó cuando estaba tratando de insertar texto cirílico a través de mi formulario de contacto.
Vadim Anisimov
15

Quería combinar un par de publicaciones para obtener una respuesta completa de esto, ya que parece ser unos pocos pasos.

  1. Por encima del consejo de @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

Nuevamente, por consejo sobre todas las conexiones jdbc tenían characterEncoding=UTF-8y se characterSetResults=UTF-8eliminaron de ellas

Con este conjunto -Dfile.encoding=UTF-8parecí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

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ejecute esta consulta que le brinda lo que necesita sonar

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 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-8no está habilitado y parece funcionar como se esperaba

E2A ¿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:

show create table user

  `password` varchar(255) CHARACTER SET latin1 NOT NULL,
  `username` varchar(255) CHARACTER SET latin1 NOT NULL,

Puede ver que algunos todavía son 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 vamos a reducirlo:

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 funcionara.

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

VH
fuente
Pregunta: ¿el último comando ALTER TABLE convertirá el contenido de todos los campos VARCHAR en una cadena codificada UTF8 genuina y válida? Pregunto porque tengo problemas para convertir mis campos LATIN1 a UTF8, específicamente cuando se encuentra el carácter ñ, la conversión falla directamente debido a un valor de cadena incorrecto (error 1366).
andreszs
si quieres decir lo 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ó en passwordvarchar (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 estado
VH
7

En mi caso, probé 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 juego 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. :)

loco_fago
fuente
7

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, 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

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

Paso 2: en database.yml use

encoding :utf8mb4
ravi
fuente
4

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 ;
shareef
fuente
¿Qué pasa si tengo un montón de tablas que quiero cambiar en la base de datos? ¿Y si todos tienen un motor de almacenamiento diferente (innodb, etc.)?
Yannis Dran
4

Suponiendo que está utilizando phpmyadmin para resolver este error, siga estos pasos:

  1. phpMyAdmin
  2. tu mesa
  3. "Pestaña Estructura"
  4. cambiar la clasificación de su campo de latin1_swedish_ci(o lo que sea) autf8_general_ci
Teo Mihaila
fuente
55
No es válido, supones que usa phpMyAdmin.
ShaH
no funciona ... y la colación cambia en 'operación' y no en estructura
Olorunfemi Ajibulu
@OlorunfemiAjibulu sí, también puedes cambiarlo en "estructura". Para algunas personas aquí, funcionó
Teo Mihaila
@TeoMihaila Quizás, es versionar.
Olorunfemi Ajibulu
3

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.

BTR Naidu
fuente
3
El OP mencionó que se están insertando mil registros ...
Gellie Ann
3

Tuve este problema con mi aplicación PLAY Java. Este es mi seguimiento de pila para esa excepción:

javax.persistence.PersistenceException: Error[Incorrect string value: '\xE0\xA6\xAC\xE0\xA6\xBE...' for column 'product_name' at row 1]
  at io.ebean.config.dbplatform.SqlCodeTranslator.translate(SqlCodeTranslator.java:52)
  at io.ebean.config.dbplatform.DatabasePlatform.translate(DatabasePlatform.java:192)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:83)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:49)
  at io.ebeaninternal.server.core.PersistRequestBean.executeInsert(PersistRequestBean.java:1136)
  at io.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:723)
  at io.ebeaninternal.server.core.PersistRequestBean.executeNoBatch(PersistRequestBean.java:778)
  at io.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:769)
  at io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:456)
  at io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:406)
  at io.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:393)
  at io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1602)
  at io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1594)
  at io.ebean.Model.save(Model.java:190)
  at models.Product.create(Product.java:147)
  at controllers.PushData.xlsupload(PushData.java:67)
  at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$40(Routes.scala:690)
  at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:134)
  at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:133)
  at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$8$$anon$2$$anon$1.invocation(HandlerInvoker.scala:108)
  at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:88)
  at play.http.DefaultActionCreator$1.call(DefaultActionCreator.java:31)
  at play.core.j.JavaAction.$anonfun$apply$8(JavaAction.scala:138)
  at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:655)
  at scala.util.Success.$anonfun$map$1(Try.scala:251)
  at scala.util.Success.map(Try.scala:209)
  at scala.concurrent.Future.$anonfun$map$1(Future.scala:289)
  at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:29)
  at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:29)
  at scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60)
  at scala.concurrent.impl.CallbackRunnable.run(Promise.scala)
  at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56)
  at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70)
  at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48)
  at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68)
  at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete(Promise.scala:368)
  at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete$(Promise.scala:367)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.onComplete(Promise.scala:375)
  at scala.concurrent.impl.Promise.transform(Promise.scala:29)
  at scala.concurrent.impl.Promise.transform$(Promise.scala:27)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.transform(Promise.scala:375)
  at scala.concurrent.Future.map(Future.scala:289)
  at scala.concurrent.Future.map$(Future.scala:289)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.map(Promise.scala:375)
  at scala.concurrent.Future$.apply(Future.scala:655)
  at play.core.j.JavaAction.apply(JavaAction.scala:138)
  at play.api.mvc.Action.$anonfun$apply$2(Action.scala:96)
  at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:304)
  at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)
  at scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60)
  at scala.concurrent.impl.CallbackRunnable.run(Promise.scala)
  at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
  at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)
  at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
  at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:81)
  at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:91)
  at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)
  at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:43)
  at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
  at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
  at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
  at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.sql.SQLException: Incorrect string value: '\xE0\xA6\xAC\xE0\xA6\xBE...' for column 'product_name' at row 1
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
  at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
  at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
  at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
  at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
  at io.ebeaninternal.server.type.DataBind.executeUpdate(DataBind.java:82)
  at io.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:122)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:73)
  ... 59 more

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.

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Md Ashfak Chowdhury
fuente
2

Si solo desea aplicar el cambio solo para un campo, puede intentar serializar el campo

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end
Paul Marclay
fuente
2

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í.

CREATE TABLE tablename (
<list-of-columns>
)
CHARSET SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Puede leer más detalles: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html

amucunguzi
fuente
2

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

sql-mode = "....."

descomentarlo. O en mi caso simplemente escriba / agregue

sql-mode = "NO_ENGINE_SUBSTITUTION"

¿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

bla \ x12

salva

bla [] (caja)

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

usuario2905554
fuente
En mi settings.py (Proyecto Django), cambié a sql-mode = "NO_ENGINE_SUBSTITUTION". Esta funcionando.
Taciano Morais Silva
1

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

zhuochen shen
fuente
1

Debe configurar utf8mb4 en meta html y también en su servidor alter tabel y establecer la clasificación en utf8mb4

Sona Israyelyan
fuente
1

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)

  • collation_connection: utf8mb4_unicode_ci
  • collation_database: utf8mb4_unicode_ci
  • servidor_collation: utf8mb4_unicode_ci
  • character_set_client: utf8mb4
  • character_set_connection: utf8mb4
  • character_set_database: utf8mb4
  • character_set_results: utf8mb4
  • character_set_server: utf8mb4

Nota: character_set_system permanece "utf8"

Estos comandos SQL NO FUNCIONAN PERMANENTEMENTE , solo en una sesión:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;
electrobabe
fuente
0

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:

SHOW PROCEDURE STATUS;

… Para ver qué procedimientos no se han actualizado a los nuevos valores de character_set_client, collation_connection y Database Collation del servidor.

Ethan Allen
fuente