MySQL排序规则类型是否需要匹配PHP页面字符集类型?

时间:2009-05-12 11:22:46

标签: php mysql rss character-encoding collation

我已经开始调试我的RSS源,因为它中有一些奇怪的字符(即缺少字符的字形)。我从两个优秀的初学者资源开始:

我认为我们的RSS源出现问题的原因是因为用户将MS Word文档复制并粘贴到网站上的textarea中,而我们的PHP页面使用的是“iso-8859-1”字符集,这与特殊字符不兼容“Windows-1252”编码用于MS Word使用的项目符号和智能引号。

所以我希望解决这个问题,我需要做的就是在接受/提供用户输入的页面中开始使用“utf-8”。即在HEAD部分中设置以下内容:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

我提出这个问题的真正原因是因为我存储用户输入的数据库字段位于“latin1_swedish_ci”,我想知道是否需要将它们转换为“{{1} }“? MySQL真的不关心charset吗?它只看到一堆字节,如果我将Unicode放入一个整理为拉丁语的字段中它仍然会以Unicode的形式返回?更改字段会很烦人,因为该字段是FULLTEXT索引的一部分,其他字段也需要更改其排序,这意味着删除索引并重建它(当涉及大量TEXT时这不是一项小任务。)

4 个答案:

答案 0 :(得分:6)

  

我提出这个问题的真正原因是,因为我存储用户输入的数据库字段位于“latin1_swedish_ci”中,我想知道是否需要将它们转换为“utf8_general_ci”?

没有。 latin1_swedish_ciutf8_general_ci是排序规则 - 而不是字符集。排序规则不会影响字符的存储方式或输入/输出方式。它仅控制排序功能如何排序结果。整理 - 按预期工作 - 应与存储字符集匹配。因此,如果您的表存储在utf8中,则应使用utf8排序规则。

mysql的存储字符集并不直接绑定到php中的字符集。您可以使用utf8作为Mysql的存储字符集,同时在php中使用iso-8859-1。在这种情况下,您需要通过在连接(set names XXX)上设置charset来告诉Mysql。然后Mysql将根据需要进行转换。如果你没有在Mysql和php上使用相同的字符集,你最终会得到最低的dommon分母的字符集容量,所以即使字符串存储在utf8中,你也不会拥有完整的unicode字符范围可用。因此,你应该在两个 Mysql和php中使用utf8。

答案 1 :(得分:1)

不 - 绝对不是。由于MySQL具有将字符串从一个字符集转换为另一个字符集的能力,因此尽管MySQL服务器知道您在客户端使用的字符集很重要(客户端= PHP脚本, NOT < / strong>访问您网页的客户端)。这可以通过发出查询

来完成
SET NAMES 'utf8';

在您发送到服务器的任何其他查询之前。然后,MySQL将从客户端字符集中进行适当的转换,将内部MySQL字符集转换为表和/或列字符集,并一直返回。因此,通常您只需要担心设置正确的客户端字符集。此字符集必须与用于将数据输出到Web服务器的字符集匹配。

请查看MySQL手册:

答案 2 :(得分:1)

为了节省一些时间来搜索如何使用pdo / mysql很好地改变mysql连接字符集,我在这里是如何做的:

$dbc = new pdo('mysql:dbname=DBNAME;host=DBHOST', $user, $pw, array(PDO::MYSQL_ATTR_INIT_COMMAND => sprintf( "SET NAMES %s", $charset ) ) );

答案 3 :(得分:0)

在HTTP中,字符编码由HTTP响应的Content-Type header field中的charset参数声明。 Other declaration are overwritten by the declaration in the HTTP header

  

[...]用户代理在确定文档的字符编码时必须遵循以下优先级(从最高优先级到最低优先级):

     
      
  1. charset”字段中的HTTP“Content-Type”参数。
  2.   
  3. META声明,其中“http-equiv”设置为“Content-Type”,值设置为“charset”。
  4.   
  5. 在指定外部资源的元素上设置charset属性。
  6.   

此外,您应该使用form元素中的accept-charset attribute显式声明接受的字符编码。否则,用户代理可以采用(但不得)表单文档中使用的字符编码来对输入数据进行编码:

  

此属性的默认值是保留字符串“UNKNOWN”。用户代理可以将此值解释为用于传输包含此FORM元素的文档的字符编码。

这应该为您提供输入数据正确编码的最佳机会。但它没有保证。因此,请更好地检查数据是否使用UTF-8进行实际编码(有功能/算法可以执行此操作)。