"Valore stringa errato" quando si tenta di inserire UTF-8 in MySQL tramite JDBC?


228

Ecco come è impostata la mia connessione:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

E sto ricevendo il seguente errore quando tiro per aggiungere una riga a una tabella:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

Sto inserendo migliaia di record e ottengo sempre questo errore quando il testo contiene \ xF0 (ovvero il valore di stringa errato inizia sempre con \ xF0).

Le regole di confronto della colonna sono utf8_general_ci.

Quale potrebbe essere il problema?


Sarebbe LETTERA PICCOLA LATINA N CON TILDE (ñ).
andreszs

Se altri riscontrano questo problema, puoi provare: Nel database: ALTER DATABASE database_name SET DI CARATTERI utf8mb4 COLLATE utf8mb4_unicode_ci; - Risolverà le tabelle create "d'ora in poi". NON per le tabelle EXIST. Per loro devi fare: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Fonte: digitalocean.com/community/questions/…
lingar

Risposte:


321

MySQL utf8consente solo i caratteri Unicode che possono essere rappresentati con 3 byte in UTF-8. Qui hai un personaggio che ha bisogno di 4 byte: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 SAUIL LETTERA GOTICA ).

Se hai MySQL 5.5 o successivo, puoi modificare la codifica della colonna da utf8a utf8mb4. Questa codifica consente la memorizzazione di caratteri che occupano 4 byte in UTF-8.

Potrebbe anche essere necessario impostare la proprietà del server character_set_serversu utf8mb4nel file di configurazione di MySQL. Sembra che Connector / J sia impostato su Unicode a 3 byte altrimenti :

Ad esempio, per utilizzare set di caratteri UTF-8 a 4 byte con Connector / J, configurare il server MySQL con character_set_server=utf8mb4e lasciare characterEncodingfuori la stringa di connessione Connector / J. Connector / J rileverà automaticamente l'impostazione UTF-8.


151
Che strana scelta avere utf8 significa davvero "il sottoinsieme di UTF8 che può essere rappresentato in 3 byte".
Eric J.

4
character_encoding_servernon è un nome di variabile di configurazione MySQL valido. Ho cercato di serie character_set_servera utf8mb4, invece, oltre alle singole colonne, ma non ha cambiato nulla.
Romain Paulus,

20
# Per ogni database: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # Per ogni tabella: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # Per ogni colonna: ALTER TABLE table_name CHANGE nome_colonna nome_colonna VARCHAR (191) SET DI CARATTERI utf8mb4 COLLATE utf8mb4_unicode_ci;
iKing

14
Bizzarro che UTF-8 non è UTF-8 fino a quando non viene aggiornato per essere UTF-8
Klors

3
Quindi stai suggerendo che UTF-8 con 3 (tre) byte non è in grado di memorizzare LETTERA PICCOLA LATINA N CON TILDE (ñ), e abbiamo bisogno di 4 (quattro) byte per scrivere correttamente "España"? Veramente? Potrebbe essere più inefficiente di questo? Cosa possiamo memorizzare oltre a AZ e 0-9 con 3 byte, quindi ...
Andreszs

95

Le stringhe che contengono \xF0sono semplicemente caratteri codificati come byte multipli usando UTF-8.

Sebbene le regole di confronto siano impostate su utf8_general_ci, sospetto che la codifica dei caratteri del database, della tabella o persino della colonna possa essere diversa. Sono impostazioni indipendenti . Provare:

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

Sostituisci qualunque sia il tuo tipo di dati effettivo per VARCHAR (255)


4
In realtà ci ha provato, non ha funzionato. Il tipo di dati della colonna è LONGTEXT tra l'altro, se questo è importante.
Lior,

1
La tua app è in Java, lo prendo? Prova a richiamare Java con il file-encodingparametro che specifica UTF-8, ad esempio java -Dfile.encoding=UTF-8o aggiungi un'opzione appropriata nel tuo file di configurazione Tomcat (ecc.).
Eric J.

1
Suggerisco di porre l'accento su "la codifica dei caratteri del database, della tabella o persino della colonna potrebbe essere diversa" . Questa è la cosa più importante.
Gellie Ann,

Dovrai modificare anche la tabella con SET DI CARATTERI utf8 COLLATE utf8_general_ci quindi dopo aver cambiato la colonna SET DI CARATTERI utf8mb4 COLLATE utf8mb4_general_ci
Shobhit Sharma

68

Ha lo stesso problema, per salvare i dati con utf8mb4necessità di assicurarsi:

  1. character_set_client, character_set_connection, character_set_resultssono utf8mb4: character_set_cliente character_set_connectionindicano il set di caratteri in cui le istruzioni vengono inviate dal client, character_set_resultsindica il set di caratteri in cui il server restituisce i risultati della query al client.
    Vedi charset-connection .

  2. la codifica di tabella e colonna è utf8mb4

Per JDBC, ci sono due soluzioni:

Soluzione 1 (è necessario riavviare MySQL):

  1. modificare my.cnfcome segue e riavviare MySQL:

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

questo può assicurarsi che il database e character_set_client, character_set_connection, character_set_resultssiano utf8mb4di default.

  1. riavvia MySQL

  2. cambiare la codifica di tabella e colonna in utf8mb4

  3. ARRESTO specificando characterEncoding=UTF-8e characterSetResults=UTF-8nel connettore JDBC, causare questo avrà la precedenza character_set_client, character_set_connection, character_set_resultsautf8

Soluzione 2 (non è necessario riavviare MySQL):

  1. cambiare la codifica di tabella e colonna in utf8mb4

  2. specificando characterEncoding=UTF-8nel connettore jdbc, perché il connettore jdbc non è supportato utf8mb4.

  3. scrivi la tua istruzione sql in questo modo (devi aggiungere allowMultiQueries=trueal connettore jdbc):

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

questo assicurerà che ogni connessione al server lo character_set_client,character_set_connection,character_set_resultssia utf8mb4.
Vedi anche charset-connection .


3
Il punto 3 è stato il clincher per me in concomitanza con la modifica delle codifiche db, table & field: 'SET NAMES utf8mb4; INSERT INTO Mytable ...';
kbbucks,

Il punto 3 ha funzionato anche per me, la mia codifica della tabella era già impostata su utf8mb4.
Sir_Faenor

La codifica della tabella è solo un valore predefinito. È sufficiente modificare la codifica della colonna in utf8mb4.
Rick James,

Il secondo approccio dovrebbe essere usato in modo selettivo, cioè non essere mai applicato alle SELECTquery, poiché set names utf8mb4; select ... from ...non produrrà mai un ResultSete si tradurrà invece in un ResultSet is from UPDATE. No Data.errore.
Bass

soluzione 2, solo il par. Mi sono stato di aiuto quando stavo cercando di inserire testo in cirillico attraverso il mio modulo di contatto.
Vadim Anisimov,

15

Volevo combinare un paio di post per dare una risposta completa a questo dato che sembra essere a pochi passi.

  1. Consigli sopra di @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

Ancora una volta dai consigli soprattutto le connessioni jdbc avevano characterEncoding=UTF-8e characterSetResults=UTF-8rimosse da loro

Con questo set -Dfile.encoding=UTF-8sembrava non fare alcuna differenza.

Non riuscivo ancora a scrivere testi internazionali in db ottenendo lo stesso fallimento di cui sopra

Ora sto usando questo how-to-convert-an-whole-mysql-database-characterset-and-collation-to-utf-8

Aggiorna tutto il tuo db da usare utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Esegui questa query che ti fornisce ciò che deve essere suonato

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%')

Copia incolla output nell'editor sostituisce tutto | senza nulla postare nuovamente in mysql quando connesso al corretto db.

Questo è tutto ciò che doveva essere fatto e tutto sembra funzionare per me. Non il -Dfile.encoding=UTF-8 non è abilitato e sembra funzionare come previsto

E2A Hai ancora problemi? Sono certamente in produzione, quindi risulta che è necessario controllare cosa è stato fatto sopra, poiché a volte non funziona, ecco la ragione e la correzione in questo scenario:

show create table user

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

Puoi vedere alcuni che stanno ancora cercando di aggiornare manualmente il record in latino:

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

Quindi restringiamolo:

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)

In breve, ho dovuto ridurre le dimensioni di quel campo per far funzionare l'aggiornamento.

Ora quando corro:

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

Funziona tutto


Domanda: l'ultimo comando ALTER TABLE convertirà il contenuto di tutti i campi VARCHAR in una stringa codificata UTF8 valida e autentica? Lo chiedo perché ho problemi a convertire i miei campi LATIN1 in UTF8, in particolare quando viene trovato il carattere ñ, la conversione fallisce direttamente a causa di un valore di stringa errato (errore 1366).
andreszs

se intendi ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;abbastanza stranamente quando l'ho eseguito l'ultima volta in tutti i campi non è stato più definito un set di caratteri. così la password dall'alto è diventata passwordvarchar (255) NOT NULL, (niente sulla codifica). Ciò significa che l'ultimo comando deve aver semplicemente fatto cercare a mysql quale fosse la definizione della tabella effettiva e poiché ora la tabella era di default questa non era più necessaria per i campi - presumo siano rimasti con il set di caratteri semplicemente perché durante il dump di interi aggiornamenti della tabella non è stato in grado di aggiornarlo e quindi è stato lasciato in quello stato
VH

7

Nel mio caso, ho provato tutto sopra, niente ha funzionato. Sono abbastanza sicuro, il mio database appare come di seguito.

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

quindi, cerco il set di colonne in ogni tabella

show create table company;

Si scopre che il set di caratteri della colonna è latino. Ecco perché, non riesco a inserire il cinese nel database.

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

Questo potrebbe aiutarti. :)


7

Ho avuto lo stesso problema nel mio progetto di rotaie:

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

Soluzione 1: prima di salvare in db convertire la stringa in base64 di Base64.encode64(subject) e dopo il recupero dall'uso di dbBase64.decode64(subject)

Soluzione 2:

Passaggio 1: modifica il set di caratteri (e le regole di confronto) per la colonna soggetto di

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

Passaggio 2: utilizzare database.yml

encoding :utf8mb4

4

basta fare

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 ;

cosa succede se ho un sacco di tabelle che voglio cambiare nel database però? e se tutti hanno un motore di archiviazione diverso (innodb, ecc.)?
Yannis Dran,

4

Supponendo che tu stia utilizzando phpmyadmin per risolvere questo errore, segui questi passaggi:

  1. phpMyAdmin
  2. your_table
  3. "Scheda Struttura"
  4. cambia la Raccolta del tuo campo da latin1_swedish_ci(o qualunque cosa sia) autf8_general_ci

5
Non valido, stai supponendo che usi phpMyAdmin.
ShaH,

non funziona ...... e le regole di confronto vengono modificate in "operazione" e non in struttura
Olorunfemi Ajibulu

@OlorunfemiAjibulu sì, puoi cambiarlo anche in "struttura". Per alcune persone qui, ha funzionato
Teo Mihaila il

@TeoMihaila Forse è il controllo delle versioni.
Olorunfemi Ajibulu,

3

È principalmente causato da alcuni personaggi unicode. Nel mio caso era il simbolo della valuta della Rupia.

Per risolvere rapidamente questo problema, ho dovuto individuare il personaggio che causa questo errore. Copio incollato l'intero testo in un editor di testo come vi e ho sostituito il carattere problematico con uno di testo.


3
L'OP ha menzionato che sono stati inseriti un migliaio di dischi ....
Gellie Ann,

3

Ho avuto questo problema con la mia applicazione Java PLAY. Questa è la mia traccia dello stack per quell'eccezione:

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

Stavo cercando di salvare un record usando io.Ebean. L'ho risolto ricreando il mio database con regole di confronto utf8mb4 e ho applicato l'evoluzione del gioco per ricreare tutte le tabelle in modo che tutte le tabelle debbano essere ricreate con le regole di confronto utf-8.

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2

Se desideri applicare la modifica solo per un campo, puoi provare a serializzare il campo

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end


2

questa non è la soluzione di raccomandazione .. Ma vale la pena condividere. Dal momento che il mio progetto sta aggiornando il DBMS dal vecchio Mysql al più recente (8). Ma non posso cambiare la struttura della tabella, solo la configurazione DBMS (mysql). La soluzione per il server mysql.

prova su Windows mysql 8.0.15 su mysql config cerca

sql-mode = "....."

decommentarlo. O nel mio caso basta digitare / aggiungere

sql-mode = "NO_ENGINE_SUBSTITUTION"

perché non la soluzione consigliata. perché se usi latin1 (il mio caso) .. i dati vengono inseriti correttamente ma non il contenuto (mysql non risponde con errore !!). per esempio digiti informazioni come questa

bla \ x12

salva

bla [] (scatola)

okay .. per il mio problema .. Posso cambiare il campo in UTF8 .. Ma c'è un piccolo problema .. vedi sopra la risposta su un'altra soluzione non è riuscita perché la parola non è inserita perché contiene più di 2 byte (cmiiw) .. questo soluzione per rendere i tuoi dati di inserimento diventano box. Il ragionevole è usare BLOB .. e puoi saltare la mia risposta.

Un altro test correlato a questo era .. utilizzando utf8_encode sul codice prima di salvare. Uso su latin1 ed è stato un successo (non sto usando la modalità sql )! uguale alla risposta precedente usando base64_encode .

Il mio suggerimento di analizzare i requisiti della tabella e di provare a passare da un altro formato a UTF8


Nel mio settings.py (Progetto Django), sono passato a sql-mode = "NO_ENGINE_SUBSTITUTION". Sta funzionando.
Taciano Morais Silva,


1

È necessario impostare utf8mb4 in meta html e anche nel server alter tabel e impostare le regole di confronto su utf8mb4


1

Suggerimento: su AWS RDS è necessario un nuovo gruppo di parametri per il tuo database MySQL con i parametri (anziché modificare un file my.cnf)

  • collation_connection: utf8mb4_unicode_ci
  • collation_database: utf8mb4_unicode_ci
  • collation_server: 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 rimane "utf8"

Questi comandi SQL NON FUNZIONANO PERMANENTAMENTE - solo in una sessione:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

0

Ho anche dovuto abbandonare e ricreare tutte le procedure memorizzate (e anche le funzioni) del database per eseguirle all'interno del nuovo set di caratteri di utf8mb4.

Correre:

SHOW PROCEDURE STATUS;

... per vedere quali procedure non sono state aggiornate ai nuovi valori character_set_client, collation_connection e Database Collation del server.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.