今日、興味深い問題に遭遇しました。私のユーザー テーブルでは、すべてのフィールドが latin1_swedish_ci です。パスワードは、ユーザー固有のソルトとそのパスワードの md5 ハッシュとして保存されます。
このクエリはエラーになります。
SELECT * FROM users
WHERE email = '...'
AND password = MD5('1234' + salt)
について不平を言う#1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
最後の行を次のように変更すると:
AND password = CAST(MD5('1234' + salt) AS CHAR CHARACTER SET latin1)
クエリは問題なく実行されます。
最初に、私の入力 (ここでは '1234') が文字セットを混乱させているのではないかと疑っていましたが、md5 のみを使用してsalt
他の入力を使用せずに単純なテスト選択を試みましたが、それでも文字エンコード エラーが残りました。
比較のためにmd5をlatin1としてキャストすることは1つのオプションであり、パスワード列をutf8_general_ciに設定することもあると思います。ただし、私の質問は次のとおりです。
なんで?供給した部分が異なるエンコーディングであっても、md5 が utf8 のように見えるものを返すのはなぜですか?