照合順序が違うカラムの外部結合


増築を繰り返している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 の使用

Current rating: 5

コメント

コメントを投稿
コメントするには TORICO-ID にログインしてください。
ログイン コメント利用規約