我是否需要更改MySQL数据库的默认字符集?

时间:2012-06-13 12:35:37

标签: mysql character-encoding

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

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

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

我注意到我的数据库表似乎有"默认字符集"设为latin1。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

是的,但MySql有几个级别,其中charset可能不同,而整理实际上并不是最重要的级别

清单以确保工作正常:

1)table 整理(你要存储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以它进入的方式出现时,你就明白了。