未从数据库中检索的UTF-8特殊字符

时间:2013-09-09 15:05:46

标签: php mysql utf-8 mysqli

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

3 个答案:

答案 0 :(得分:2)

尽管@ user4035的意图是正确的,但实施和推理都是错误的。

  1. 不会无条件地将任何错误输出到浏览器中。程序员不会看到它,而用户与它无关。
  2. SET NAMES 'UTF8'不等于set_charset()函数。前者是一个特殊的SQL查询,不应该用于后一个函数。
  3. 更好的版本如下。

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

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

答案 1 :(得分:0)

尝试:

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

mysql_select_db("asdasd", $con);

答案 2 :(得分:0)

连接到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的字符集   语句到服务器...它还指定服务器应该的字符集   用于将结果发送回客户端。