PDO MySQL UTF-8:从数据库读取的数据显示不正确

4

show variables:

character_set_client        utf8
character_set_connection    utf8
character_set_database      utf8
character_set_filesystem    binary
character_set_results       utf8
character_set_server        latin1
character_set_system        utf8
collation_connection        utf8_general_ci
collation_database          utf8_unicode_ci
collation_server            latin1_swedish_ci

插入的数据为UTF-8编码且在数据库中正确显示,HTML头设置为utf-8,meta标签设置为utf-8。站点上所有来自数据库以外的内容都能正确显示,只有来自数据库的内容不能正确显示。

连接(PDO):

$pdo = new PDO("mysql:host=$hostname;dbname=$database;charset=utf8",$username,$password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

所以,我猜测这与show variables的输出有关,因为它显示服务器的字符集和排序规则不是utf-8?然而,我在同一台本地服务器上运行其他网站没有任何问题。你有什么想法可以帮我找到正确的解决方案吗?


2
"SET NAMES utf8"已经过时,您已经将其作为字符集参数传递,请尝试不使用它(但如果它还没有解决您的问题,则不要再次添加它)。 - hakre
@hakre:谢谢你的帮助,现在它可以工作了。你想发表一个答案,这样我就可以接受它吗? - Helmut
1个回答

3

在您的PDO连接中:

new PDO(
    "mysql:host=$hostname;dbname=$database;charset=utf8",
                                           ############
    $username, $password, array(
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
                                         ##############
    )
);

您正在使用已弃用的SQL SET NAMES utf8,不再建议使用。实际上,您已经在PDO DSN字符串中使用了charset参数,这是推荐的方式:charset=utf8

只需删除SET NAMES utf8初始化命令,您就可以正常运行。

new PDO(
    "mysql:host=$hostname;dbname=$database;charset=utf8",
    $username, $password
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接