1

我正在使用将数据存储在我的 MySQL 数据库表中,htmlentities()但我发现这是不可取的,所以我正在更改它。

我现在以原始格式存储数据(使用 PDO 准备好的语句),并在输出时根据需要对其进行转换。在某些情况下,我希望将数据输出为 HTML。

我所有采用 HTML 输出的网页的字符集都设置为 utf-8。但是我在这篇文章中注意到,该海报 Mythli 评论说,“没有必要 [使用] htmlspecialchars() 输入到数据库,因为你想显示 html 并且不需要 [使用] htmlentities() 输入到数据库如果您网站的字符集与您在数据库中使用的字符集相同 "

我注意到我的数据库表似乎将“默认字符集”设置为 latin1。

我应该将其更改为 "utf8" 吗?

4

2 回答 2

1

是的,如果您在数据库中存储 UTF-8 数据,您应该将它们存储在 UTF-8 表/列中。否则,有两种情况:

  1. 您通知数据库您将插入以 UTF-8 编码的数据(请参阅 参考资料SET NAMES utf8)。如果应该存储数据的列设置为存储 latin1,MySQL 将正确处理编码并将您的输入从 UTF-8 转换为 latin1。这会导致所有无法用 latin1 表示的字符丢失。
  2. 您没有通知数据库您要插入 UTF-8 数据,数据库需要 latin1 编码的数据。在这种情况下,数据库会将传入的数据误解为单个字节,这恰好可以工作,因为 MySQL 将简单地存储单个字节。它们在数据库中看起来像垃圾,但到 PHP 的往返将透明地工作。

因此,最好告诉您的数据库您要将 UTF-8 存储在 UTF-8 列中,这样您的数据就可以干净地往返。另请参阅在 Web 应用程序中从前到后处理 Unicode

于 2012-06-13T13:16:21.047 回答
0

是的,但是 MySql 有几个级别的字符集可能不同,而排序规则实际上并不是最重要的

确保一切正常运行的清单:

1) 表排序规则(存储 html 的字段)应使用 utf-8

2)您与数据库的连接。以下处理不止一个问题:

mysqli_query("SET NAMES 'utf8'");

3)正如你所说,改变数据库和表的默认字符集也是一个好主意。您可能希望排序规则不区分大小写 (utf8_unicode_ci)

4) 在插入非拉丁字符的那一天之前,这一切都无关紧要,因此在没有测试的情况下这样做几乎没有意义。

这是一个很好的细分,哪些值是一致的,以及一个要测试的字符串: http: //adviesenzo.nl/examples/php_mysql_charset_fix/

Iñtërnâtiônàlizætiøn以它进入的方式出现时,你得到了它。

于 2012-06-13T13:16:11.613 回答