web-dev-qa-db-ja.com

character_set_clientの値をutf8mb4に設定します

このガイド に従って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に設定するにはどうすればよいですか?

12
qwaz

開示:私は MySQLデータベースで完全なUnicodeをサポートする方法 の作成者です、あなたがフォローしているガイドです。

  1. 変更した設定はどこに保存しましたか? 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
    
  2. 変更後、mysqld restartを実行してmysqldを再起動しましたか?

14
Mathias Bynens

私もそのガイドに従いましたが、同じ問題が再び発生しました。実際の問題は、引数としてDEFAULT CHARACTERを取るDBの作成に使用されるコマンドにあります。実行中に渡されない場合、utfmb4ではないデフォルトの文字セットが渡されます。

以下は私がそれを修正するために従った手順です:

  1. utf8mb4文字セットでダミーデータベースを作成します。

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
    
  2. 実際のデータベースからこのダミーデータベースに実際の構造とデータをコピーする

    mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy

  3. 現在のデータベースを削除

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
    
  4. 新しいデータベースを作成する

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
    
  5. 最後に、テーブル構造とデータを元のデータベースに戻します

    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です
2