我今天遇到了一个有趣的问题。在我的用户表中,所有字段都是 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”)可能会混淆字符集,但我尝试了简单的测试选择,只有一个 md5salt
并且没有其他输入,但字符编码错误仍然存在。
我想将 md5 转换为 latin1 进行比较是一种选择,另一种可能是将密码列设置为 utf8_general_ci。然而,我的问题是:
为什么?为什么即使您输入的部分采用不同的编码,md5 也会返回似乎是 utf8 的内容?