プロジェクト

全般

プロフィール

UTF-8MB4の絵文字、機種依存文字に対応する

SympaではUTF-8の絵文字や機種依存文字が含まれるUTF-8MB4はデフォルトでは対応しないが、DB側で対応することで
利用可能……ということになっている。

  • https://www.sympa.community/manual/install/setup-database-mysql.html
    MySQL/MariaDB 5.5.3 or later provides utf8mb4 character set which covers full range of Unicode including such as 
    Chinese ideographs used for persons' names. As of Sympa-6.2a.33 r8753, both utf8 and utf8mb4 character sets 
    are supported. To use utf8mb4 character set, you might want to replace utf8 in SQL statement above with utf8mb4.
    

    が、上記で説明されているように下記のDB作成時の文字コードを変更するだけでは対応しない。
    $ mysql
    mysql> CREATE DATABASE sympa CHARACTER SET utf8; ←これを「utf-8mb4」にする
    mysql> GRANT ALL PRIVILEGES ON sympa.* TO <db_user>@<client host>
        -> IDENTIFIED BY '<db_passwd>';
    mysql> QUIT
    

通常のUTF-8MB4利用手順

  • まず前提として上記のDB作成時の文字コードはUTF-8MB4で指定する必要がります。
    mysql> CREATE DATABASE sympa CHARACTER SET utf8mb4;
    
  • 次にmariadbのサーバ、クライアント設定をutf-8mb4をデフォルトで使用するように変更します。
    • /etc/my.cnf.d/mariadb-server.cnf
      [mysqld]
      character-set-server = utf8mb4
      
    • /etc/my.cnf.d/mysql-clients.cnf
      [mysql]
      default-character-set = utf8mb4
      
    • /etc/my.cnf.d/client.cnf
      [client]
      default-character-set = utf8mb4
      
  • サービスを再起動する
    systemctl restart mariadb
    
  • DBの文字コード設定を確認する。
    # mysql -u root -p
    MariaDB [(none)]> show variables like '%character%';
    +--------------------------+------------------------------+
    | 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                         | ←これ以外がutf8mb4である
    | character_sets_dir       | /usr/share/mariadb/charsets/ |
    +--------------------------+------------------------------+
    
  • 通常はこれで利用可能になっているはず。
    Webインタフェースで絵文字や機種依存文字を読者の名前などに当ててみる。
    フォームにSubmitしたあと、対象文字が「?」に変換されずに登録出来ること。

上記だけではダメなケース

ここから先の手順は、Sympaの初期DB投入プログラムの改良で直っていることがあるかもしれません。

Sympaのデータベース投入プログラムが良くないのか、上記だけではダメなケースがある。
この場合は下記のように調べ、該当すると対処する必要があります。

  • DBを直接変更するので、作業前に念のためsympaデータベースのバックアップを取得します。
    # mysqldump -u root -p -B sympa> mysqldump.sql
    
  • 対称DBのテーブルを調べ、各テーブルの文字コード設定を確認します。
    # mysql -u root -p sympa
    MariaDB [sympa]> show tables;
    +-----------------------+
    | Tables_in_sympa       |
    +-----------------------+
    | admin_table           |
    | conf_table            |
    | exclusion_table       |
    | inclusion_table       |
    | list_table            |
    | logs_table            |
    | netidmap_table        |
    | notification_table    |
    | one_time_ticket_table |
    | session_table         |
    | stat_counter_table    |
    | stat_table            |
    | subscriber_table      |
    | user_table            |
    +-----------------------+
    
    MariaDB [sympa]> show create table admin_table;
    | admin_table | CREATE TABLE `admin_table` (
    (中略)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | ←ここがそれぞれUTF-8のまま
    
  • 上記のようにテーブル単位の「CHARSET」「COLLATE」設定がUTF-8になっている場合があります。
    この場合は正しくUTF-8MB4が扱えず、フォームSubmit時に対称文字が「?」に変換されてしまいます。
  • この場合、引き続き下記のようにまずDB自体の文字コードを変更します。(念のため)
    恐らく新しくテーブルを作る場合に効果があるはずです。
    ALTER DATABASE sympa CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    
  • 次に、「テーブルごとに」次のクエリでこれらの設定を変更します。
    テーブル事なので、上記の「show tables;」の結果のテーブル全てに行う必要があります。
    MariaDB [sympa]> ALTER TABLE admin_table CONVERT TO character SET utf8mb4 COLLATE utf8mb4_unicode_ci; ←変更
    MariaDB [sympa]> show create table admin_table; ←確認
    | admin_table | CREATE TABLE `admin_table` (
    (中略)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | ←UTF-8MB4になっている
    
    ※これを全テーブル「admin_table」〜「user_table」まで繰り返します
    
  • DBを抜けて、念のためサービスを再起動します。
    systemctl restart mariadb
    systemctl restart sympa wwsympa
    
  • Web画面から動作確認をします。
    読者一覧画面でアドレスをクリックし、その読者情報設定で「名前」に機種依存文字や絵文字を入れてみると良いでしょう。

以上で設定は完了です。