5

今日、興味深い問題に遭遇しました。私のユーザー テーブルでは、すべてのフィールドが 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 のように見えるものを返すのはなぜですか?

4

1 に答える 1