【问题标题】:UTF-8 special characters not retrieved from database未从数据库中检索到的 UTF-8 特殊字符
【发布时间】:2013-09-09 15:05:46
【问题描述】:

我有一个 MySQL 数据库,其中包含各种语言的单词,因此我将表列设置为“utf8_unicode_ci”。 UTF-8 可以包含所有可能的字符,并且 unicode_ci 也具有正确的排序(并且性能较低)。当我在 phpMyAdmin 中浏览表格时,所有特殊字符看起来都不错。问题是当我 SQL SELECT 一堆名称并将它们显示在我的网站上时,字符无法显示/编码不正确(看起来像 Chrome 中的问号,资源管理器中的正方形等)。我为我的网站设置了正确的编码: <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> 各种字符粘贴到我的页面也可以显示。该问题仅在从数据库中检索它们时出现。 php mysqli_query() 是否更改了编码或 SELECT 查询是否以某种方式搞砸了?

【问题讨论】:

    标签: php mysql utf-8 mysqli


    【解决方案1】:

    虽然@user4035的意图是对的,但无论是执行还是推理都是错误的。

    1. 不要无条件地将任何错误直接输出到浏览器中。程序员不会看到它,而用户与它无关。
    2. SET NAMES 'UTF8' 不等于 set_charset() 函数。前者是一个特定的 SQL 查询,不应将其用于支持后者的功能。

    更好的版本如下。

    您必须使用set_charset() 方法设置连接字符集:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $con=mysqli_connect("host", "user", "pw", "db");
    $con->set_charset("utf8");
    

    【讨论】:

    • 我用过这个,现在终于可以用了!其实我用的是程序版本:mysqli_set_charset($con, "utf8");
    【解决方案2】:

    试试:

    mysql_query("SET NAMES 'utf8'", $con);
    

    之前

    mysql_select_db("asdasd", $con);
    

    【讨论】:

      【解决方案3】:

      连接 MySQL 后尝试使用SET NAMES 'UTF8'

      $con=mysqli_connect("host", "user", "pw", "db");
      if (!$con)
      {
          die('Failed to connect to mySQL: ' .mysqli_connect_errno());
      }
      
      /* change character set to utf8 */
      if (!$con->set_charset("utf8")) {
          printf("Error loading character set utf8: %s\n", $con->error);
      }
      

      正如manual 所说:

      SET NAMES 表示客户端将使用什么字符集发送 SQL 对服务器的语句...它还指定服务器应该使用的字符集 用于将结果发送回客户端。

      【讨论】:

        猜你喜欢
        • 2016-05-24
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        相关资源
        最近更新 更多