MySQL のストアド プロシージャを通じて選択を実行しようとすると、以下のエラーが発生します。
演算 '=' の照合順序 (latin1_general_cs,IMPLICIT) と (latin1_general_ci,IMPLICIT) の不正な組み合わせです
ここで何が間違っているのか、何か考えはありますか?
テーブルの照合順序は でありlatin1_general_ci
、where 句の列の照合順序は ですlatin1_general_cs
。
ベストアンサー1
これは通常、互換性のない照合順序の 2 つの文字列を比較するか、または結合された列に異なる照合順序のデータを選択しようとすることによって発生します。
この句を使用するCOLLATE
と、クエリで使用する照合を指定できます。
たとえば、次のWHERE
句では、投稿したエラーが常に発生します。
WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs
解決策としては、クエリ内の 2 つの列に共有照合を指定します。このCOLLATE
句を使用する例を次に示します。
SELECT * FROM table ORDER BY key COLLATE latin1_general_ci;
別のオプションとして、次のBINARY
演算子を使用します。
BINARY str は CAST(str AS BINARY) の省略形です。
解決策は次のようになります。
SELECT * FROM table WHERE BINARY a = BINARY b;
または、
SELECT * FROM table ORDER BY BINARY a;
コメントで Jacob Stamm が指摘しているように、「列をキャストして比較すると、その列のインデックスはすべて無視される」ことに注意してください。
この照合ビジネスについてさらに詳しく知りたい方は、eggyalの同じ質問に対する素晴らしい回答。