代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  3
  • Tom  · 技术社区  · 7 年前

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

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

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

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

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

    4 回复  |  直到 17 年前
        1
  •  6
  •   troelskn    17 年前

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

    latin1_swedish_ci utf8_general_ci 是排序规则,而不是字符集。排序规则不会影响字符的存储或输入/输出方式。它只控制排序函数对结果排序的方式。排序规则(要按预期工作)应与存储字符集匹配。因此,如果表存储在utf8中,则应使用utf8排序规则。

    set names XXX 二者都

        2
  •  1
  •   Stefan Gehrig    17 年前

    不,绝对不是。由于MySQL能够动态地将字符串从一个字符集转换为另一个字符集,因此MySQL服务器知道您在客户端使用的字符集(client-side=PHP脚本,

    SET NAMES 'utf8';
    

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

    请看一下MySQL手册:

        3
  •  1
  •   Galen    17 年前

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

    charset 中的参数 Content-Type header field Other declaration are overwritten by the declaration in the HTTP header :

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

    1. “HTTP” 字符集 “a中的参数” 内容类型 “外地。
    2. META 声明与“ http-equiv “设置为” 内容类型 “和为设置的值” 字符集 ".
    3. 字符集 指定外部资源的元素上的属性集。

    此外,还应使用 accept-charset attribute form

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

    这将为您提供正确编码传入数据的最佳机会。但它没有受到保护。因此,最好检查数据是否使用UTF-8进行了准确编码(有函数/算法可以做到这一点)。

    推荐文章