MySQL在字段中存储ââ

时间:2010-11-23 10:23:10

标签: php mysql decode encode

Hay,我做了一个简单的应用程序,用户将内容上传到MySQL数据库,但是某些实体没有被编码。这样的事情出现

ââ¬Å

而不是引号而不是。我知道应该在将这些值插入数据库时​​将这些值编码为HTML实体,但是现在有几千行包含数据。

当数据返回浏览器时,我们是否有PHP函数来编码这些值?


Alex Brown 更新。由于编码可能也是一个问题,这就是我所看到的:

alt text

1 个答案:

答案 0 :(得分:5)

您的用户的浏览器正在提交UTF-8编码的数据,但您要连接到数据库,其中1)假设您正在提交latin1编码的数据2)将您的数据存储为latin1编码的字符串。因此,您的数据存储错误编码。

当你从数据库中检索数据时,它将作为latin1字符串提供但由于latin1字符串只是错误编码的UTF-8,并且PHP天真地将所有字符串视为二进制字符串,你只需要原始的UTF-8再串起来。当您将此字符串回显到再次声明为UTF-8编码的HTML页面时,该字符串将显示为用户提交的字符串。

但是,如果使用对MySQL处理字符集有深入理解的软件查看数据库的内容,该软件会将列字符集标识为latin1,并确保它显示的字符确实是latin1字符串,正如我们所指出的那样是错误编码的UTF-8。因此,您会看到错误编码的数据。

您需要采取一些措施来解决这个问题。首先,您期望处理UTF-8编码的数据(在HTML级别声明),因此您应该确保这也是您与MySQL通信的方式。您可以在形成与数据库的连接时通过发出SET NAMES 'utf8'来执行此操作。 (注意:您的数据库API可能会提供一个用于更改连接字符集的特殊功能。我认为mysql API没有,但我不确定。)

其次,您应该确保存储UTF-8编码的数据。这意味着您的数据库列的字符集应为utf8。可以使用ALTER TABLE ... MODIFY语句更改列字符集。不要忘记也更改表默认字符集(这会为添加到未明确指定字符集的表中的新列设置字符集)。并且在您使用时更改数据库字符集。

但是,当您更改列字符集时,MySQL会假定已存储在该表的行中的数据不会被错误编码,而是存储在旧字符集中的有效数据。因此,它会将您的错误编码的UTF-8数据(它被视为latin1编码数据)转换为UTF-8编码数据,这样您就可以获得双UTF-8编码的数据。有一个技巧可以解决这个问题:首先将列字符集转换为binary字符集,然后从binary转换为utf8。这样,MySQL不会更改数据的二进制形式,因为您通过一种格式将其转换为任意二进制字符串。

祝你好运!