概要
アプリケーション開発を行っていたところ下記のようなエラーが出た。
この現象について調査する。
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 | +----------------------+--------------------+
アプリケーションの方も無事に動作した。
[…] mariadbのcollationをutf8mb4 に対応させる | ++頭道++ […]
[…] mariadbのcollationをutf8mb4 に対応させる | ++頭道++ […]