“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?

Lior
fonte
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.

Joni
fonte
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)

Eric J.
fonte
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 .

madtracy
fonte
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

VH
fonte
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. :)

crazy_phage
fonte
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
Ravi
fonte
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 ;
shareef
fonte
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
Teo Mihaila
fonte
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.

BTR Naidu
fonte
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;
Md Ashfak Chowdhury
fonte
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
Paul Marclay
fonte
2

Se você estiver criando uma nova tabela MySQL, poderá especificar o conjunto de caracteres de todas as colunas na criação, e isso resolveu o problema para mim.

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

Você pode ler mais detalhes: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html

amucunguzi
fonte
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

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

minha solução é alterar o tipo de coluna de varchar (255) para blob

zhuochen shen
fonte
1

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

Sona Israyelyan
fonte
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;
electrobabe
fonte
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.

Ethan Allen
fonte