増築を繰り返しているMysqlデータベースを使用しているとたまにある問題の解決方法
作成されたタイミングの違うテーブルの照合順序があっていないことがあります。
古いテーブルのカラムの照合順序がutf8_unicode_ciで、
最近作られたテーブルのカラムの照合順序がutf8_general_ci
必要データがこのふたつのテーブルにあるため外部結合しなければならない自体になった。
普通にLEFT JOINしようとすると
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.code = t2.code
照合順序が違うカラム同士では外部結合できないとエラーが発生します。
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
これの解決のためにカラムの設定を変えてしまうのは影響範囲が大きいのでできれば避けたい。
そんな場合にはCOLLATE句を使用することで解決できます。
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.code COLLATE utf8_general_ci = t2.code
これで問題なく外部結合して結果を取得することができました。
mysqlのドキュメントにはWHERE句、ORDER句、GROUP句などでの使い方は書いてありましたが、外部結合での使い方は書いてなかったので備忘録として残しておきます。
MySQL 5.6 リファレンスマニュアル 10.1.7.2 SQL ステートメントでの COLLATE の使用