大多数のクエリでは、MySQL
がどの照合順序により比較演算を行うかは明確になっています。たとえば以下の場合、照合順序が
``カラム x
のカラム照合順序''
になることは明らかです。
SELECT x FROM T ORDER BY x; SELECT x FROM T WHERE x = x; SELECT DISTINCT x FROM T;
ただし、複数のオペランドが使用されていると、あいまいになることがあります。たとえば、以下のような場合です。
SELECT x FROM T WHERE x = 'Y';
x
の照合順序と文字列リテラル
'Y'
の照合順序のどちらがこのクエリで使用されるのでしょうか。
標準 SQL では、``強制可能''
ルールと呼ばれていた方法で上記の問題を解決しました。これについては、以下の発想が基本となっています:
x
と 'Y'
の両方に照合順序があるので、どちらの照合順序を優先するかを判断しなければならない。複雑な問題だが、これらのルールでほとんどの状況に対応できる。
明示的な COLLATE
節は優先順位が 4。
照合順序の異なる文字列 2 つの連結は優先順位が 3。
カラムの照合順序は優先順位が 2。
リテラルの照合順序は優先順位が 1。
これらのルールによって、あいまいさは次のように解消されます。
優先順位が最も高い照合順序を使用する。
双方の優先順位が一致する場合、照合順序が一致しないとエラーとなる。
例:
column1 = 'A' |
column1 の照合順序を使用する。 |
column1 = 'A' COLLATE x |
'A' の照合順序を使用する。 |
column1 COLLATE x = 'A' COLLATE y |
エラー |
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.