MariaDB(MySQL)の文字コードを設定(変更)する

データベースのMariaDB(MySQL)の文字コードの確認と設定方法について説明しています。

動作環境

最終更新日:2023/1/9

◾️動作環境とバージョン情報です
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つです。
・ec2
$ 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】

MariaDB(MySQL)の文字コードをUTF8に変更する

以下のコマンドは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を使用している場合、MySQLの設定ファイル.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 |
+----------+-----------------------------+---------------------+--------+