AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Illegal mix of collations

collation が異なる同士で参照しようとしてオワ、というエラーらしい。

like 検索で死んでいた

観測した環境では (utf8_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation 'like' ということでまあう〜ん、という感じだった。

雑に治すならデータベース全体に統一した collation で ALTER してしまえばいいんだけど、 ALTER はめちゃコスト高いので。 出来れば雑ではなく、実行する範囲を絞りたいなあと思い。 「そういや SHOW CREATE TABLE STATUS とかで見る以外ってどうすんだろう」という感じだったので雑に調べた。

参考

qiita.com

こういうことらしい

データベース
SELECT @@character_set_database, @@collation_database;
テーブル
SHOW TABLE STATUS FROM データベース名;
カラム
USE information_schema;
SELECT table_name, column_name, collation_name FROM columns  WHERE table_schema="データベース名" AND collation_name IS NOT NULL;

charcter

最初はアプリケーション側でセットされている [client] の値と、サーバー側の文字コードが不一致でダメなのでは? (データベース内で collation が異なることなんてある?) と思っていた。

mysql> 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       | /opt/homebrew/Cellar/mysql@8.4/8.4.4_3/share/mysql/charsets/ |
+--------------------------+--------------------------------------------------------------+

実際上記のような設定だったが、問題を起こしているデータベースのコピーを取得したところ、以下のように一部 collation が異なっていた。

| user                    | logon                            | utf8mb4_0900_ai_ci |
| user                    | password                         | utf8mb3_bin        |

ウムー。 想定してないトコも異なってるなコレ、思ったより大変そう。