“Valor incorreto de string” ao tentar inserir UTF-8 no MySQL via JDBC?


228

É assim que minha conexão é definida:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

E estou recebendo o seguinte erro ao tentar adicionar uma linha a uma tabela:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

Estou inserindo milhares de registros e sempre recebo esse erro quando o texto contém \ xF0 (ou seja, o valor incorreto da string sempre começa com \ xF0).

O agrupamento da coluna é utf8_general_ci.

Qual poderia ser o problema?


Essa seria a PEQUENA LETRA LATINA N COM TILDE (ñ).
— precisa saber é o seguinte

Para outras pessoas que enfrentam esse problema, tente: No banco de dados: ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - Ele resolverá as tabelas "a partir de agora" criadas. NÃO para tabelas EXIST. Para eles, você precisa fazer: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Fonte - digitalocean.com/community/questions/…
— lingar 17/06

Respostas:


321

O MySQL utf8permite apenas os caracteres Unicode que podem ser representados com 3 bytes em UTF-8. Aqui você tem um caractere que precisa de 4 bytes: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LETTER SAUIL ).

Se você possui o MySQL 5.5 ou posterior, pode alterar a codificação da coluna de utf8para utf8mb4. Essa codificação permite o armazenamento de caracteres que ocupam 4 bytes em UTF-8.

Você também pode ter que definir a propriedade do servidor character_set_serverpara utf8mb4no arquivo de configuração do MySQL. Parece que o Connector / J assume como padrão o Unicode de 3 bytes, caso contrário :

Por exemplo, para usar conjuntos de caracteres UTF-8 de 4 bytes com Connector / J, configure o servidor MySQL com character_set_server=utf8mb4e deixe de characterEncodingfora da cadeia de conexão Connector / J. O conector / J detectará automaticamente a configuração UTF-8.


151
Que escolha estranha para ter utf8 realmente significa "o subconjunto de UTF8 que pode ser representado em 3 bytes".
— Eric J.

4
character_encoding_servernão é um nome válido de variável de configuração do MySQL. Tentei definir character_set_servercomo utf8mb4alternativa, além de colunas individuais, mas não mudou nada.
— Romain Paulus

20
# Para cada banco de dados: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # Para cada tabela: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # Para cada coluna: ALTER TABLE nome_tabela CHANGE nome_da_coluna nome_coluna VARCHAR (191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
— IKing

14
Estranho que UTF-8 não é UTF-8 até que seja atualizado para ser UTF-8
— Klors

3
Então, você está sugerindo que UTF-8 com 3 (três) bytes não pode armazenar LETRA LATINA PEQUENA N COM TILDE (ñ), e precisamos de 4 (quatro) bytes para soletrar "España" corretamente? Realmente? Poderia ser mais ineficiente do que isso? O que podemos armazenar além AZ e 0-9 com 3 bytes então ..
— andreszs

95

As cadeias que contêm \xF0são simplesmente caracteres codificados como vários bytes usando UTF-8.

Embora seu agrupamento esteja definido como utf8_general_ci, suspeito que a codificação de caracteres do banco de dados, tabela ou mesmo coluna possa ser diferente. Eles são configurações independentes . Experimentar:

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

Substitua qualquer que seja o seu tipo de dados real por VARCHAR (255)


4
Na verdade tentei isso, não funcionou. O tipo de dados da coluna é LONGTEXT btw, se isso importa.
— Lior

1
Seu aplicativo está em Java, entendi? Tente chamar Java com o file-encodingparâmetro que especifica UTF-8, por exemplo, java -Dfile.encoding=UTF-8ou adicione uma opção apropriada no seu arquivo de configuração do Tomcat (etc.).
— Eric J.

1
Eu sugiro que você enfatize "a codificação de caracteres do banco de dados, tabela ou mesmo coluna pode ser diferente" . Essa é a coisa mais importante.
— Gellie Ann

Você precisará alterar a tabela também com CHARACTER SET utf8 COLLATE utf8_general_ci e, depois de alterar a coluna CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
— Sharma

68

Tem o mesmo problema, para salvar os dados com utf8mb4necessidades, verifique se:

  1. character_set_client, character_set_connection, character_set_resultssão utf8mb4: character_set_cliente character_set_connectionindica o conjunto de caracteres no qual as instruções são enviadas pelo cliente, character_set_resultsindica o conjunto de caracteres no qual o servidor retorna os resultados da consulta ao cliente.
    Veja charset-connection .

  2. a codificação de tabela e coluna é utf8mb4

Para o JDBC, existem duas soluções:

Solução 1 (precisa reiniciar o MySQL):

  1. modifique my.cnfda seguinte maneira e reinicie o MySQL:

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

isso pode garantir que o banco de dados character_set_client, character_set_connection, character_set_resultsesteja utf8mb4por padrão.

  1. reinicie o MySQL

  2. altere a codificação de tabela e coluna para utf8mb4

  3. PARAR especificando characterEncoding=UTF-8e characterSetResults=UTF-8no conector jdbc, causar este irá substituir character_set_client, character_set_connection, character_set_resultsautf8

Solução dois (não precisa reiniciar o MySQL):

  1. altere a codificação de tabela e coluna para utf8mb4

  2. especificando characterEncoding=UTF-8no conector jdbc, porque o conector jdbc não suporta utf8mb4.

  3. escreva sua declaração sql como esta (precisa adicionar allowMultiQueries=trueao conector jdbc):

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

isso garantirá que cada conexão ao servidor character_set_client,character_set_connection,character_set_resultsseja utf8mb4.
Veja também charset-connection .


3
O ponto 3 foi o argumento decisivo para mim em conjunto com a alteração das codificações db, table & field: 'SET NAMES utf8mb4; INSERT INTO Mytable ...';
— Kbbucks #

O ponto 3 também fez o truque para mim, minha codificação de tabela já definida como utf8mb4.
— 8267 Sir_Faenor

A codificação da tabela é apenas um padrão. É suficiente alterar a codificação da coluna para utf8mb4.
— 21718 Rick Rick James

A segunda abordagem deve ser usada seletivamente, ou seja, nunca será aplicada a SELECTconsultas, pois set names utf8mb4; select ... from ...nunca produzirá um ResultSete, em vez disso, resultará em um ResultSet is from UPDATE. No Data.erro.
— Baixo

solução 2, apenas o par. Ajudei-me quando tentava inserir texto cirílico no meu formulário de contato.
— Vadim Anisimov

15

Eu queria combinar algumas postagens para obter uma resposta completa disso, pois parece haver algumas etapas.

  1. Acima conselhos de @madtracey

/etc/mysql/my.cnf ou /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

Novamente dos conselhos acima de todas as conexões jdbc tiveram characterEncoding=UTF-8e foram characterSetResults=UTF-8removidas

Com este conjunto -Dfile.encoding=UTF-8parecia não fazer diferença.

Ainda não consegui escrever texto internacional em db, obtendo o mesmo erro acima

Agora, usando este como converter um conjunto de caracteres mysql-banco de dados-conjunto de caracteres e agrupamento em utf-8

Atualize todo o seu db para usar utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Execute esta consulta que fornece o que precisa ser tocado

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 e colar saída no editor substituir todos | com nada poste de volta no mysql quando conectado para corrigir db.

Isso é tudo o que precisava ser feito e tudo parece funcionar para mim. Não o - Dfile.encoding=UTF-8não está ativado e parece funcionar conforme o esperado

E2A Ainda está com algum problema? Eu certamente estou em produção, então você precisa verificar o que foi feito acima, pois às vezes não funciona, aqui está a razão e a correção neste cenário:

show create table user

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

Você pode ver que alguns ainda estão tentando atualizar o registro manualmente:

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

Então, vamos reduzi-lo:

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)

Em resumo, tive que reduzir o tamanho desse campo para que a atualização funcionasse.

Agora, quando eu corro:

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

Tudo funciona


Pergunta: o último comando ALTER TABLE converterá o conteúdo de todos os campos VARCHAR em uma string codificada UTF8 genuína válida? Eu pergunto porque estou tendo problemas para converter meus campos LATIN1 em UTF8, especificamente quando o caractere ñ é encontrado, a conversão falha diretamente devido a um valor incorreto de string (erro 1366).
— precisa saber é o seguinte

se você quer dizer ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;estranhamente quando eu executei isso na última vez, todos os campos não tinham mais um conjunto de caracteres definido. então a senha de cima se tornou passwordvarchar (255) NOT NULL, (nada sobre codificação). Isso significa que o último comando simplesmente deve ter feito pesquisa no mysql qual era a definição real da tabela e, como agora a tabela era por padrão, os campos não precisam mais dela - presumo que eles permaneceram com o conjunto de caracteres simplesmente porque durante o despejo de atualizações de tabela inteiras não poderia atualizá-lo e, portanto, ele foi deixado naquele estado
— VH

7

No meu caso, tentei de tudo acima, nada funcionou. Tenho certeza de que meu banco de dados se parece abaixo.

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

então, procuro o conjunto de colunas em todas as tabelas

show create table company;

Acontece que o conjunto de colunas é latino. Por isso, não consigo inserir chinês no banco de dados.

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

Isso pode ajudá-lo. :)


7

Eu tive o mesmo problema no meu projeto de trilhos:

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

Solução 1: antes de salvar em db, converta a string em base64 Base64.encode64(subject) e depois da busca no db useBase64.decode64(subject)

Solução 2:

Etapa 1: altere o conjunto de caracteres (e agrupamento) da coluna de assunto por

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

Etapa 2: No database.yml, use

encoding :utf8mb4

4

apenas faça

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 ;

e se eu tiver várias tabelas que desejo alterar no banco de dados? e se todos tiverem um mecanismo de armazenamento diferente (innodb, etc)?
— Yannis Dran

4

Supondo que você esteja usando o phpmyadmin para resolver esse erro, siga estas etapas:

  1. phpMyAdmin
  2. sua mesa
  3. "Guia Estrutura"
  4. altere o agrupamento do seu campo de latin1_swedish_ci(ou o que for) parautf8_general_ci

5
Não é válido, você está supondo que ele use o phpMyAdmin.
— ShaH 10/09

não funciona ...... e o agrupamento é alterado em 'operação' e não na estrutura
— Olorunfemi Ajibulu 24/02

@OlorunfemiAjibulu sim, você também pode alterá-lo na "estrutura". Para algumas pessoas aqui, funcionou
— Teo Mihaila

@TeoMihaila Talvez seja versão.
— Olorunfemi Ajibulu

3

É causada principalmente devido a alguns caracteres unicode. No meu caso, era o símbolo da moeda da Rúpia.

Para corrigir isso rapidamente, tive que identificar o personagem que causava esse erro. Copiei colei o texto inteiro em um editor de texto como o vi e substitui o caractere problemático por um texto.


3
O OP mencionou que existem mil registros sendo inseridos ....
— Gellie Ann

3

Eu tive esse problema com meu aplicativo Java PLAY. Este é o meu rastreamento de pilha para essa exceção:

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

Eu estava tentando salvar um registro usando io.Ebean. Corrigi-o recriando meu banco de dados com o agrupamento utf8mb4 e apliquei o play evolution para recriar todas as tabelas, para que todas as tabelas fossem recriadas com o agrupamento utf-8.

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2

Se você deseja aplicar a alteração apenas a um campo, tente serializar o campo

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end


2

Esta não é a solução de recomendação. Mas vale a pena compartilhar. Desde que meu projeto está atualizando o DBMS do antigo Mysql para o mais novo (8). Mas não consigo alterar a estrutura da tabela, apenas a configuração do DBMS (mysql). A solução para o servidor mysql.

teste on do Windows mysql 8.0.15 no mysql configuração pesquisa

modo sql = "....."

descomente. Ou, no meu caso, basta digitar / adicionar

sql-mode = "NO_ENGINE_SUBSTITUTION"

por que não solução recomendada. porque se você usa latin1 (meu caso) .. os dados são inseridos com sucesso mas não o conteúdo (mysql não responde com erro !!). por exemplo, você digita informações como esta

bla \ x12

isso salva

bla [] (caixa)

ok .. para o meu problema .. posso alterar o campo para UTF8 .. mas há um pequeno problema .. veja acima a resposta sobre outra solução falhou porque a palavra não foi inserida porque contém mais de 2 bytes (cmiiw) .. isso solução faça com que seus dados de inserção se tornem caixa. O razoável é usar blob .. e você pode pular minha resposta.

Outro teste relacionado a isso foi .. usando utf8_encode no seu código antes de salvar. Eu uso no latin1 e foi um sucesso (não estou usando o modo sql )! o mesmo que a resposta acima usando base64_encode .

Minha sugestão para analisar seu requisito de tabela e tentei mudar de outro formato para UTF8


No meu settings.py (Projeto Django), mudei para sql-mode = "NO_ENGINE_SUBSTITUTION". Está funcionando.
— Taciano Morais Silva


1

Você precisa definir utf8mb4 no meta html e também no servidor, alterar o rótulo e definir agrupamento para utf8mb4


1

Dica: No AWS RDS, você precisa de um novo Grupo de Parâmetros para o seu MySQL DB com os parâmetros (em vez de editar um 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 permanece "utf8"

Esses comandos SQL NÃO FUNCIONAM PERMANENTEMENTE - apenas em uma sessão:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

0

Também tive que eliminar e recriar todos os procedimentos armazenados do banco de dados (e também funções) para que eles sejam executados no novo conjunto de caracteres utf8mb4.

Corre:

SHOW PROCEDURE STATUS;

… Para ver quais procedimentos não foram atualizados para os novos valores character_set_client, collation_connection e Database Collation do servidor.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.