【问题标题】:MySQL storing ââ¬Å in fieldMySQL在字段中存储â€Å
【发布时间】:2011-05-14 09:23:40
【问题描述】:

嘿,我制作了一个简单的应用程序,用户可以将内容上传到 MySQL 数据库,但是有些实体没有被编码。出现这样的情况

ââ¬Å

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

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


亚历克斯·布朗 更新。由于编码在这里也可能是一个问题,这就是我所看到的:

【问题讨论】:

  • 您在数据库中使用什么字符编码,用于连接和输出?
  • 这是 DEFAULT CHARSET=latin1;
  • 我们无法在不知道您使用的语言环境/字符集的情况下扭转这种情况
  • “我知道在将这些值插入数据库时​​应该将它们编码为 HTML 实体...” 无需在数据库级别执行此操作(并且可能有充分的理由不这样做),您只需要在输出包含从数据库检索的数据的 HTML 时处理它。您需要做的是确保您的字符编码是正确的。值得一读:joelonsoftware.com/articles/Unicode.html
  • @dotty:这个输出出现在哪里?你如何产生这个输出?

标签: php mysql decode encode


【解决方案1】:

您用户的浏览器正在提交 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 不会更改数据的二进制形式,因为您正在通过一种将其视为任意二进制字符串的格式对其进行转换。

祝你好运!

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多