【问题标题】:Do I need to change the default character set of my MySQL database?我需要更改 MySQL 数据库的默认字符集吗?
【发布时间】:2012-06-13 12:35:36
【问题描述】:

使用 htmlentities() 将数据存储在我的 MySQL 数据库表中,但我看到这是 inadvisable,所以我正在更改它。

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

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

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

我应该把它改成“utf8”吗?

【问题讨论】:

    标签: mysql character-encoding


    【解决方案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 列中,这样您的数据就会有一个干净的往返。另见Handling Unicode Front To Back In A Web App

    【讨论】:

    • 感谢您提供的信息。我想可以按列设置数据库的字符集值吗?
    • 我会为每个表设置一个默认值,如果可能的话,甚至是整个数据库。但是,是的,最终列设置是决定因素。
    【解决方案2】:

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

    确保一切顺利进行的清单:

    1) 表 column 排序规则(您存储 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以它进入的方式出现时,你得到了它。

    【讨论】:

    • 感谢您提供的重要信息。 SET NAMES 的问题在于我正在使用 PDO 语句,如果我做对了,PDO 语句的正确方法是在连接字符串中使用charset=utf8。但是,据我了解,这仅适用于高于 5.3.6 版本的 PHP 版本,但我使用的是 5.2.17 版本,并且我不能使用 if 构造基于 MySQL 版本进行连接,因为我不先连接就无法知道 MySQL 版本。不知道如果我在连接字符串中使用$dbh -> exec("set names utf8");charset=utf8 会产生什么结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2015-05-18
    • 2012-02-12
    • 2022-01-17
    • 2015-09-29
    • 2012-08-17
    相关资源
    最近更新 更多