JDBCを介してMySQLにUTF-8を挿入しようとしたときに「文字列値が正しくありません」?


228

これは私の接続が設定される方法です:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

また、テーブルに行を追加しようとすると、次のエラーが発生します。
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

何千ものレコードを挿入していますが、テキストに\ xF0が含まれている場合は常にこのエラーが発生します(つまり、正しくない文字列値は常に\ xF0で始まります)。

列の照合順序はutf8_general_ciです。

何が問題でしょうか?


これは、ラテン小文字Nとチルダ(ñ)になります。
andreszs

他の人がこの問題に遭遇した場合は、次のことを試してみてください:データベース:ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -「これから作成するテーブル」を解決します。EXISTテーブル用ではありません。彼らのためにあなたがする必要があります:ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ソース- digitalocean.com/community/questions/...
lingar

回答:


321

MySQL utf8は、UTF-8で3バイトで表すことができるUnicode文字のみを許可します。ここに4バイトを必要とする文字があります:\ xF0 \ x90 \ x8D \ x83(U + 10343 GOTHIC LETTER SAUIL)。

MySQL 5.5以降を使用している場合は、列のエンコーディングをからutf8に変更できますutf8mb4。このエンコーディングでは、UTF-8で4バイトを占める文字を格納できます。

MySQL構成ファイルでサーバープロパティcharacter_set_serverutf8mb4に設定する必要がある場合もあります。それ以外の場合Connector / Jのデフォルトは3バイトUnicodeのようです。

たとえば、Connector / Jで4バイトのUTF-8文字セットを使用するには、MySQLサーバーをcharacter_set_server=utf8mb4で構成しcharacterEncoding、Connector / J接続文字列を除外します。Connector / Jは、UTF-8設定を自動検出します。


151
utf8を選択するのは、「3バイトで表現できるUTF8のサブセット」を意味します。
エリックJ.

4
character_encoding_serverは有効なMySQL構成変数名ではありません。代わりに、個々の列に加えてを設定しようとしcharacter_set_serverましutf8mb4たが、何も変更されませんでした。
Romain Paulus 14

20
#データベースごと:ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; #各テーブルについて:ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; #各列に対して:ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191)CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
iKing 2015

14
UTF-8に更新されるまでUTF-8がUTF-8ではないという奇妙なこと
Klors

3
つまり、3バイトのUTF-8ではラテン小文字Nのチルト(ñ)を格納できず、「スペイン」を正しく綴るには4バイトが必要であることを示唆しています。本当に?これよりも効率が悪いのでしょうか?AZと0-9以外に3バイトで何を格納できるか..
andreszs

95

含む文字列は\xF0、単純にある複数のバイトとしてエンコードされた文字 UTF-8を使用しました。

照合順序はutf8_general_ciに設定されていますが、データベース、テーブル、または列の文字エンコードが異なる可能性があります。これらは独立した設定です。試してください:

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

VARCHAR(255)を実際のデータ型に置き換えます


4
実際に試してみましたが、うまくいきませんでした。これが重要な場合、列のデータ型はLONG​​TEXT btwです。
Lior

1
あなたのアプリはJavaです。file-encodingUTF-8を指定するパラメーターを使用してJavaを呼び出してみてください。たとえばjava -Dfile.encoding=UTF-8、Tomcat(など)構成ファイルに適切なスイッチを追加してください。
エリックJ.

1
「データベース、テーブル、または列の文字エンコーディングが異なる場合があります」に重点を置くことをお勧めします。それが一番大事なことです。
ジェリーアン2017

CHARACTER SET utf8 COLLATE utf8_general_ciを使用してテーブルも変更する必要があります。その後、列を変更した後、CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
Shobhit Sharma

68

同じ問題が発生したため、utf8mb4必要に応じてデータを保存するには、次のことを確認する必要があります。

  1. character_set_client, character_set_connection, character_set_resultsare utf8mb4character_set_clientおよびcharacter_set_connectionクライアントがステートメントを送信するときにcharacter_set_results使用する文字セットを示し、サーバーがクエリ結果をクライアントに返すときに使用する文字セットを示します。charset-connectionを
    参照してください。

  2. テーブルと列のエンコーディングは utf8mb4

JDBCの場合、2つのソリューションがあります。

解決策1(MySQLを再起動する必要があります):

  1. my.cnf次のように変更して、MySQLを再起動します。

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

これにより、データベースを確認することができます。これcharacter_set_client, character_set_connection, character_set_resultsutf8mb4デフォルトです。

  1. MySQLを再起動します

  2. テーブルと列のエンコーディングを utf8mb4

  3. 指定STOP characterEncoding=UTF-8およびcharacterSetResults=UTF-8JDBCコネクタで、これは無効になりますが発生character_set_clientcharacter_set_connectioncharacter_set_resultsutf8

ソリューション2(MySQLを再起動する必要はありません):

  1. テーブルと列のエンコーディングを utf8mb4

  2. characterEncoding=UTF-8jdbcコネクタではサポートされないため、jdbcコネクタで指定しますutf8mb4

  3. 次のようにSQLステートメントを記述します(allowMultiQueries=trueJDBCコネクターに追加する必要があります):

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

これは、サーバーに必ず各接続を行いますcharacter_set_client,character_set_connection,character_set_resultsされていますutf8mb4charset-connection
も参照してください。


3
ポイント3は、db、テーブル、およびフィールドのエンコーディングの変更に関連して私にとって重要なものでした。 'SET NAMES utf8mb4; INSERT INTO Mytable ...';
kbbucks 2016年

ポイント3も私にとってはトリックでした。私のテーブルエンコーディングは既にutf8mb4に設定されています。
Sir_Faenor

テーブルのエンコーディングは単なるデフォルトです。列のエンコーディングをutf8mb4に変更するだけで十分です。
リックジェームズ

2番目のアプローチは選択的に使用する必要があります。つまりSELECT、をset names utf8mb4; select ... from ...生成せResultSetず、代わりにResultSet is from UPDATE. No Data.エラーが発生するため、クエリには適用しないでください。
ベース

ソリューション2、単なる額面 1は、コンタクトフォームからキリル文字を挿入しようとしたときに役立ちました。
Vadim Anisimov

15

これはいくつかのステップのように見えるので、これについて完全な答えを出すために2、3の投稿を組み合わせたかったのです。

  1. @madtraceyによる上記のアドバイス

/etc/mysql/my.cnf または /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

ここでも持っていたすべてのJDBC接続上記のアドバイスからcharacterEncoding=UTF-8characterSetResults=UTF-8それらから削除

このセットで-Dfile.encoding=UTF-8違いはないように見えました。

上記と同じエラーが発生して国際テキストをデータベースに書き込むことができませんでした

今、このhow-to-convert-an-entire-mysql-database-characterset-and-collat​​ion-to-utf-8を使用しています

使用するすべてのデータベースを更新する utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

実行する必要があるものを提供するこのクエリを実行します

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

エディターで出力をコピーして貼り付け、すべて置き換えます| 正しいデータベースに接続したときに、mysqlに何もポストバックしません。

これですべての作業が完了し、すべてがうまくいくようです。ない- Dfile.encoding=UTF-8有効ではなく、期待どおりに動作しているようです

E2Aまだ問題がありますか? 私は確かに本番環境にいるので、上で何が行われたかを確認する必要があることがわかります。それが機能しない場合があるためです。このシナリオの理由と修正は次のとおりです。

show create table user

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

一部はまだラテン語でレコードを手動で更新しようとしていることがわかります。

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

それでそれを絞り込みましょう:

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)

つまり、更新を機能させるために、そのフィールドのサイズを小さくする必要がありました。

今私が実行すると:

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

すべてうまくいく


質問:最後のALTER TABLEコマンドは、すべてのVARCHARフィールドの内容を有効な本物のUTF8エンコードされた文字列に変換しますか?LATIN1フィールドをUTF8に変換するときに問題があるため、特にñ文字が見つかった場合、文字列値が正しくないために変換が直接失敗します(エラー1366)。
andreszs 2017

あなたが意味する場合はALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;不思議なこと、私はすべてのフィールドはもはや定義された文字セットを持っていた、この最後の時間を実行したとき。したがって、上記のパスワードはpasswordvarchar(255)NOT NULLになりました(エンコードについては何もありません)。つまり、最後のコマンドは実際のテーブル定義が何であるかをmysqlルックアップする必要があり、デフォルトではこれがフィールドであったため、フィールドはもう必要ありません-テーブル全体の更新のダンプ中に単に文字セットのままだったと思います更新できなかったため、その状態のままでした
VH

7

私の場合、私は上記のすべてを試しましたが、何もうまくいきませんでした。私のデータベースは次のようになっていると思います。

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

だから、私はすべてのテーブルで列の文字セットを調べます

show create table company;

列の文字セットがラテン語であることがわかりました。そのため、中国語をデータベースに挿入できません。

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

それはあなたを助けるかもしれません。:)


7

Railsプロジェクトでも同じ問題が発生しました。

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

解決策1:dbに保存する前にBase64.encode64(subject) 、dbを使用してフェッチすることで文字列をbase64に変換 した後Base64.decode64(subject)

解決策2:

手順1:件名列の文字セット(および照合順序)を次のように変更します。

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

ステップ2:database.ymlで

encoding :utf8mb4

4

するだけ

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 ;

データベースで変更したいテーブルがたくさんある場合はどうなりますか?そして、すべてが異なるストレージエンジン(innodbなど)を持っている場合はどうなりますか?
Yannis Dran

4

このエラーを解決するためにphpmyadminを使用していると仮定すると、次の手順に従います。

  1. phpMyAdmin
  2. your_table
  3. 「構造タブ」
  4. フィールドの照合をlatin1_swedish_ci(またはそれが何であれ)からに変更しますutf8_general_ci

5
有効ではありません。彼がphpMyAdminを使用していると想定しています。
ShaH 2018

動作しません……そして照合は構造ではなく「操作」で変更されます
Olorunfemi Ajibulu

@OlorunfemiAjibuluはい、「構造」でも変更できます。ここの一部の人にとってはうまく
いき

@TeoMihailaおそらく、バージョン管理です。
Olorunfemi Ajibulu

3

ほとんどの場合、いくつかのUnicode文字が原因です。私の場合はルピー通貨記号でした。

これをすばやく修正するには、このエラーの原因となっているキャラクターを特定する必要がありました。viのようなテキストエディターでテキスト全体をコピーして貼り付け、問題のある文字をテキストの文字に置き換えました。


3
OPは、挿入されるレコード1000あると述べました...
Gellie Ann

3

PLAY Javaアプリケーションでこの問題が発生しました。これはその例外の私のスタックトレースです:

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

io.Ebeanを使用してレコードを保存しようとしていました。utf8mb4照合を使用してデータベースを再作成することで修正し、すべてのテーブルを再作成するようにプレイエボリューションを適用して、すべてのテーブルをutf-8照合で再作成する必要があります。

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2

1つのフィールドのみに変更を適用したい場合は、フィールドをシリアル化してみることができます

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end


2

これは推奨ソリューションではありません。しかし、共有する価値があります。私のプロジェクトでは、DBMSを古いMysqlから最新の(8)にアップグレードしています。しかし、テーブル構造を変更することはできません。DBMS構成(mysql)のみです。mysqlサーバーのソリューション。

mysql config searchのWindows mysql 8.0.15でテストする

sql-mode = "....."

コメントを外します。または私の場合は単に入力/追加

sql-mode = "NO_ENGINE_SUBSTITUTION"

なぜ推奨されない解決策。latin1(私の場合)を使用すると、データは正常に挿入されますが、コンテンツは挿入されません(mysqlはエラーで応答しません!!)。たとえば、次のように情報を入力します

bla \ x12

それは保存します

bla [](ボックス)

大丈夫..私の問題..フィールドをUTF8に変更できます..しかし、小さな問題があります.. 2バイト(cmiiw)を超えるために単語が挿入されないため、他の解決策についての上記の回答は失敗します。ソリューションは、挿入データをボックスにします。妥当なのはblobを使用することです。そして、私の答えはスキップできます。

これに関連する別のテストは、保存する前にコードでutf8_encodeを使用することでした。私はlatin1で使用しましたが、成功しました(sql-modeを使用していません)。base64_encodeを使用した上記の回答と同じです

テーブルの要件を分析し、他の形式からUTF8に変更しようとした私の提案


私のsettings.py(Djangoプロジェクト)で、sql-mode = "NO_ENGINE_SUBSTITUTION"に変更しました。それは働いています。
Taciano Morais Silva


1

utf8mb4をメタhtmlで設定し、サーバーでtabelを変更して、照合順序をutf8mb4に設定する必要があります。


1

ヒント:AWS RDSでは、my.cnfを編集する代わりに、パラメーターを使用してMySQL DBの新しいパラメーターグループが必要です。

  • collat​​ion_connection:utf8mb4_unicode_ci
  • collat​​ion_database:utf8mb4_unicode_ci
  • collat​​ion_server:utf8mb4_unicode_ci
  • character_set_client:utf8mb4
  • character_set_connection:utf8mb4
  • character_set_database:utf8mb4
  • character_set_results:utf8mb4
  • character_set_server:utf8mb4

注:character_set_systemは「utf8」のままです

これらのSQLコマンドは永続的に機能ません -セッションでのみ:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

0

また、utf8mb4の新しい文字セット内で実行するために、データベースのすべてのストアドプロシージャ(および関数も)を削除して再作成する必要がありました。

実行:

SHOW PROCEDURE STATUS;

…サーバーの新しいcharacter_set_client、collat​​ion_connection、およびDatabase Collat​​ionの値に更新されていないプロシージャを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.