mariadbのcollationをutf8mb4 に対応させる

概要

アプリケーション開発を行っていたところ下記のようなエラーが出た。
この現象について調査する。

Caused by: java.sql.SQLException: Illegal mix of collations (utf8mb4_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

原因

これは utf8mb8 で作成したテーブル内部に varchar binary のカラムに対して where 条件を指定したときに発現しているようである。

collation の設定を確認したところ下記のようになっている。

MariaDB [(none)]> show variables like '%collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8_general_ci    |
| collation_server     | utf8_general_ci    |
+----------------------+--------------------+

どうやら mysqld の持っている collation が色々存在して
それとテーブルの照合順序が食い違っているということが原因のようである。
というわけで collation を一致させることで不具合の修正を図る。

対応

この辺を参考にしながら文字コードを設定する。

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

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

あまりMariaDBの設定には詳しくないが、どうやらMySQLのそれとは多少なり異なるようである。
修正して再度 collation を表示してみると無事に修正された。

MariaDB [(none)]> show variables like '%collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_bin        |
| collation_server     | utf8mb4_bin        |
+----------------------+--------------------+

アプリケーションの方も無事に動作した。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">