【データベース】Mariadb10のテーブルの文字コード(Illegal mix of collationsの対処)

SQL/データベース(DB)

Mariadb10の環境をコピー(異なるOS上で異なるMariadbのバージョン)してテスト用サーバーとして環境を準備していたのだが、とあるPHPのプログラムが動作不能に陥った。
コピー元のプログラムは正常に動作しており、テスト用サーバーの全く同一のプログラムが動作しない状況。
ログを調査すると、「PHP Fatal error: Uncaught mysqli_sql_exception: Illegal mix of collations (utf8mb3_general_ci,IMPLICIT), (utf8mb4_general_ci,COERCIBLE)・・・」が吐き出されていた。

原因追及

ログから判断すると、utf8mb3とutf8mb4が混在してる状況である。
今後非推奨であるutf8mb3は撲滅したい。
しかしなぜ、コピー元のプログラムは正常動作しているのか?
ひとつずつ謎を解いていく為、コンソールでMariadbに接続。

Mariadbの環境変数

Mariadbの環境調査をしてみる。

show variables like “char%”;

結果は以下の通り。
utf8mb3があちらこちらに設定されている。
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb3 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+

テーブルの文字コード

続いて、テーブル単位で文字コードを見てみる。

show table status from rsrcoj;

結果を見ると、utf8mb4_general_ciとutf8mb4_unicode_ci、utf8mb3_general_ciが混在し、テーブルによって様々な設定になっていた。

対処

まずは小さな所から修正を行う。
テーブル毎に文字コードが異なっている為、全てutf8mb4_general_ciに統一する。
テーブルの文字コード変更方法は以下の通り。

ALTER TABLE {テーブル名} CONVERT TO character SET utf8mb4 COLLATE utf8mb4_general_ci;

ちなみにDBの文字コード変更は以下の通り。

ALTER DATABASE {データベース名} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

修正後に動作確認を行うと、正常に動作した。

まとめ

コピー元とテーブルのcharsetが異なる設定となってしまった事については不明だが、テーブルをutf8mb4に変更する事により解決。
解決できた事は良かったのだが、発生原因にモヤモヤ感が残る結果となった。

コメント