このガイド に従ってDBをutf8mb4
に変換しようとしています。私は設定しました:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake
ただし、character_set_client
およびcharacter_set_results
の値は、utf8mb4に変更されません。
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
何が悪いのですか?これらの値をutf8mb4に設定するにはどうすればよいですか?
開示:私は MySQLデータベースで完全なUnicodeをサポートする方法 の作成者です、あなたがフォローしているガイドです。
変更した設定はどこに保存しましたか? mysqld
がデフォルトオプションをロードする場所を確認します。通常は/etc/my.cnf
( ガイドで言及されているように )ですが、システムによって異なる場合があります。次のコマンドを実行して確認します。
$ mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
変更後、mysqld restart
を実行してmysqld
を再起動しましたか?
私もそのガイドに従いましたが、同じ問題が再び発生しました。実際の問題は、引数としてDEFAULT CHARACTER
を取るDBの作成に使用されるコマンドにあります。実行中に渡されない場合、utfmb4
ではないデフォルトの文字セットが渡されます。
以下は私がそれを修正するために従った手順です:
utf8mb4
文字セットでダミーデータベースを作成します。
create database `your_db_name_dummy`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
実際のデータベースからこのダミーデータベースに実際の構造とデータをコピーする
mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy
現在のデータベースを削除
SET FOREIGN_KEY_CHECKS=0;
DROP DATABASE your_db_name;
新しいデータベースを作成する
create database `your_db_name`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
最後に、テーブル構造とデータを元のデータベースに戻します
mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name
上記の手順を使用する場合は、以下の行も注意深く読んでください。
前提条件と私の現状:
mysql --version
mysql Ver 14.14 Distrib 5.7.22、for Linux(x86_64)using EditLine wrapper
cat /etc/my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
init-connect = 'SET NAMES utf8mb4
collation-server = utf8mb4_unicode_ci
Java 'mysql:mysql-connector-Java:5.1.30'
であるクライアントを使用しています。
jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
です