MySQL: character_set_client についてのメモ

バージョン

what

  • Docker mysql:8.0.20にログインすると、日本語が ??? に文字化けしていた
  • charset.cnf (ファイル名前は何でもok) で default-character-setuft8mb4 に設定をする事で解消した
// /etc/mysql/conf.d/charset.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

[client]
loose-default-character-set = utf8mb4
  • 設定前
mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)
  • 設定後
mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)

作業時に調べたメモ

前提

  • クライアントはサーバーに接続するときに、使用する文字セットの名前を送信する
  • サーバーはこの名前を使用して、下記のシステム変数を設定する
    • character_set_client
    • character_set_results
    • character_set_connection

サーバシステム変数 (文字コード関連)

  • character_set_client
    • クライアントが送ってくるとサーバーが想定している文字コード
    • 関連オプション
      • --default-character-set オプション (my.cnf[client]default-character-set)
  • character_set_results
    • サーバーがクライアントにクエリー結果を返信するときに使用する文字コード
  • character_set_connection
  • character_set_database
  • character_set_filesystem
  • character_set_server
  • character_set_system

my.cnf[client]default-character-set

  • クライアントの文字セット
    • 指定方法はプログラム/言語に依存
  • プログラムによっては、my.cnf[client]default-character-set が有効

  • loose- プレフィックス

    • why
      • クライアントの中には default-character-set が設定されているとエラーになるケースがある
    • what
      • そのようなクライアントでエラーにならない様にオプションを無視させる

utf8mb4

  • utf8 vs utf8mb4

    • utf8
      • 文字を1〜3バイトで表現
    • utf8mb4
      • 文字を1〜4バイトで表現
    • 備考
      • MySQLUTF-8 には歴史的事情により utf8utf8mb4 の二つあるがこれからは utf8mb4 一択
  • utf8mb4_bin

    • utf8mb4 で指定できる Collation は以下の4種類
      • utf8mb4_general_ci
      • utf8mb4_unicode_ci
      • utf8mb4_unicode_520_ci
      • utf8mb4_bin
    • 上記4種の違い
      • 下記を区別するかどうか
        • 大文字小文字
        • 絵文字
        • 濁点
    • utf8mb4_bin
      • すべて区別する

参考になったエントリー