我正在尝试将字符集从 latin1 更改为 utf8
问题:密码不适用于法语字符。密码适用于特殊字符(如引号、括号、美元符号等)。如果我将代码部分中的字符集转换回 latin1,我可以使用法语字符登录,但不能使用 utf8
到目前为止我做了什么:
- 更改了数据库的字符集;我可以看到所有列类型都显示为 utf8。我在数据库和表级别都运行了查询。
- 将代码部分的字符集更改为 utf8。
- 我的测试表明一切都很酷,我可以很好地看到带有口音的法语字符,而且似乎没有任何问题。它仅适用于给我带来问题的密码。
请建议:
- 我还需要将数据本身更改为 utf8 吗?
- 我运行了 alter table 命令,它将列字符集更改为 utf8,我在这里遗漏了什么吗?
我怀疑这可能是原因,因为如果我将代码部分转换为 latin1,密码工作正常。所以我认为代码和数据库是 latin1,所以它可以识别特殊字符,但是当我将其更改为 utf8 时,它无法解释特殊的法语字母,因为它们最初存储为 latin1。
PHP 和 MySQL 版本都是最新的。
由于我的回复很长,我决定在这里添加它:
散列函数非常复杂,它使用 md5、encode64 和 crypt 函数的组合。我注意到生成的 pwd 对于 latin 和 unicode 是不同的。这就是原因,我怀疑以前使用latin1生成的pwd可以匹配pwd,而不是转换后的unicode。同样,它只发生在法语字母上,而不是 0 到 127 的 ascii 范围。我不确定如何处理现有用户可以成功登录的这种情况,将字符集更改为 unicode-8。我不能使用 iconv(),因为我无法区分密码是使用 latin1 还是 unicode8 创建的。除了更改数据库之外,我是否还需要更改数据,以及如何更改?如果我想对了,那么到 unicode8 的数据转换也可以处理法语字符吗?