collation が異なる同士で参照しようとしてオワ、というエラーらしい。
like 検索で死んでいた
観測した環境では (utf8_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation 'like' ということでまあう〜ん、という感じだった。
雑に治すならデータベース全体に統一した collation で ALTER してしまえばいいんだけど、 ALTER はめちゃコスト高いので。 出来れば雑ではなく、実行する範囲を絞りたいなあと思い。 「そういや SHOW CREATE TABLE STATUS とかで見る以外ってどうすんだろう」という感じだったので雑に調べた。
参考
こういうことらしい
データベース
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 |
ウムー。 想定してないトコも異なってるなコレ、思ったより大変そう。