データベースのMariaDB(MySQL)の文字コードの確認と設定方法について説明しています。
※ 本ページはプロモーションが含まれています。
◾️動作環境とバージョン情報です
MariaDBのバージョン:10.6
$ mariadb -V
mariadb Ver 15.1 Distrib 10.6.11-MariaDB, for Linux (x86_64) using readline 5.1
MariaDBをインストールして試したOS環境は、ec2のAmazon Linux 2(64ビット(x86))とCentOS7.9の2つです。$ cat /etc/system-release
Amazon Linux release 2 (Karoo)
・CentOS7
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
また、macOSにインストールしたMySQLでも試したけど、MariaDBと同じように文字コードの確認・設定コマンドが使えました。
OS:macOS Big Sur(バージョン11.7.2)
MySQLバージョン:MySQL Community Edition 8.0.31
$ mysql -V
mysql Ver 8.0.31 for macos12 on x86_64 (MySQL Community Server - GPL)
本記事はMariaDBをインストールしてある事を前提にしています。MariaDBのインストール方法については別ページで説明してますので、そちらを参考にしてください。
MariaDB10.6(10.5)のインストール(Amazon Linux2(ec2),CentOS7)、WordPressの環境構築
また、MySQL(フリーのCommunity Edition版)のインストールについても別ページで説明しています。
MySQLのインストール【macOS】
MySQL8のインストール方法(ec2,CentOS7)
以下のコマンドはMariaDBで実行したコマンド例ですが、MySQLでも文字コードの確認・設定のコマンドは同じように使えると思います。
まず、MariaDBインストール直後の文字コードを確認しておきます。
MariaDBの文字コードの確認は、MariaDBに接続してMariaDBプロンプト上でstatsコマンドやshow variablesコマンドでできます。
MariaDB [(none)]> status
--------------
mariadb Ver 15.1 Distrib 10.6.11-MariaDB, for Linux (x86_64) using readline 5.1
Connection id: 32
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.6.11-MariaDB MariaDB Server
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8mb3
Conn. characterset: utf8mb3
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 18 min 35 sec
Threads: 1 Questions: 67 Slow queries: 0 Opens: 17 Open tables: 10 Queries per second avg: 0.060
--------------
MariaDB [(none)]> show variables like "character%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8mb3 |
| character_set_server | latin1 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.002 sec)
MariaDB [(none)]> show variables like "collation%";
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb3_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+--------------------+
3 rows in set (0.001 sec)
latin1やutf8mb3(UTF8)が混在している状態です。
現状を把握できたので、MariaDBの文字コードの設定をします。
文字コードの設定は、/etc/my.cnf.dディレクトリに適当なファイル(拡張子は.cnf)を作成してそのファイルでします。
MariaDBの設定ファイル/etc/my.cnfがデフォルトであり、そのファイル内に/etc/my.cnf.dディレクトリ内の拡張子.cnfのファイルは全てインクルードすると設定されている。
ここでは、/etc/my.cnf.d/mariadb.cnfファイルを新規作成して編集します(文字コードはUTF8に設定してみる)。
$ cat /etc/my.cnf.d/mariadb.cnf
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
(*MariaDBの文字コードの設定は、クライアントサイドとサーバサイドそれぞれで設定できるので、両方をUTF8に設定しています。)
MySQLを使用している場合、mariadb.cnfではなくMySQLの設定ファイルのmy.cnfに追記すればできると思います。
my.cnfファイルの場所は、mysql --helpコマンドでわかります。
$ mysql --help | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
ファイルを編集したら、MariaDBを再起動します。
$ sudo systemctl restart mariadb
再起動したら、再度MariaDBに接続して文字コードを確認します。
MariaDB [(none)]> status
〜
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
〜
MariaDB [(none)]> show variables like "collation%";
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.001 sec)
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 | utf8mb3 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.001 sec)
UTF8(utf8mb4)に変更された事を確認できました!
■MariaDBの文字コードutf8mb3とutf8mb4の違いは?
ちなみに設定ファイル(上記のmariadb.cnfファイル)で文字コードをutf8に設定して文字コードを確認するとutf8mb3に変更されました。
utf8mb3とutf8mb4の違いは、両方ともUTF-8だけどバイト数の違いみたいで、1~3バイトか1~4バイトの違いみたいです。MySQLですが公式を見るとutf8mb3は非推奨で将来削除される予定とあるので、UTF8に設定するならutf8mb4の方が良さそうですね。ただそれなら何故utf8はutf8mb3のエイリアスなの?utf8mb4で良いのでは?とちょっと疑問に思いました。もしかして新バージョンではutf8mb4に変わってるかもしれません。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 10.9.3 utf8 文字セット (utf8mb3 のエイリアス)
あと、設定できる文字コードの一覧は、MariaDBプロンプト上で確認できます。
MariaDB [(none)]> show character set;
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
〜
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
〜
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
+----------+-----------------------------+---------------------+--------+