いくつかのステップのように見えるので、いくつかの投稿を組み合わせて、これに対する完全な回答を作成したいと思いました。
- @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-8
ありcharacterSetResults=UTF-8
、それらから削除されました
このセット-Dfile.encoding=UTF-8
では、違いはないように見えました。
上記と同じエラーが発生して、まだ国際テキストをデータベースに書き込むことができませんでした
今、このhow-to-convert-an-entire-mysql-database-characterset-and-collation-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
それはすべて動作します