【问题标题】:PHP: problems outputting utf8 from MySQL database using PDOPHP:使用 PDO 从 MySQL 数据库输出 utf8 的问题
【发布时间】:2012-07-09 21:34:53
【问题描述】:
$dbo = new PDO("mysql:host=localhost;dbname=database", "databaseuser",
  "databasepassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$dbo -> exec("set character_set_client='utf8'");
$dbo -> exec("set character_set_results='utf8'");
$dbo -> exec("set collation_connection='utf8_general_ci'");
$prepSnapRetrieve = $dbo->prepare(
  "SELECT * FROM znc_log WHERE `nick` LIKE :u AND `tstamp` BETWEEN :t1 AND :t2"
);
$prepSnapRetrieve->execute(array(':u' => str_replace("|osu","", $_GET['u']),
  ':t1' => $_GET['sns'], ':t2' => $_GET['sne']));
$snapshotListing = $prepSnapRetrieve->fetchAll();
echo("Snapshot of ".$_GET['u']. "'s chat on ".strftime("%e/%m/%g",$_GET['sne']));
echo("<br><br>");
foreach($snapshotListing as $chat) {
  echo "<i>" . " " . "[" . strftime("%H:%M:%S", $chat['tstamp']) . "]" .
   "</i> " . " ><u>" . $chat['channel'] . "</u>< " . "(<b>" .
   htmlspecialchars($chat['nick'])."</b>) ".htmlspecialchars($chat['message']);
  echo("<br>");
}

这个 sn-p 是代码应该解析和输出以 UTF-8 存储的 IRC 数据 - 但在回显时,任何 unicode 内容都简单地显示为:

??????

我已经查看了几个问题并包含了几个声称的修复程序,但似乎没有任何效果。另一个使用相同数据库的脚本完美地回显了 UTF-8 内容,但它使用的是 PHP 的标准 MySQL 实现,而不是 PDO。我做错了什么?

【问题讨论】:

标签: php mysql unicode utf-8 pdo


【解决方案1】:

使用 UTF8 时存在多个故障点:

  • 确保表格是 utf8

    使用 SQL-Command Show Variables; 检查表的 MySQL 字符设置。

  • 插入的数据是utf8

    您可以尝试使用 phpMyAdminerAdminer 等工具来检查,如果
    数据插入正确。尝试通过工具手动插入数据。 通过脚本插入时,不要使用基本的字符串函数。始终使用他们的 mbstring 备择方案。设置 mb_internal_encoding( 'UTF-8' ); 让 PHP 在内部处理 UTF-8。

  • 获取的数据是utf8

    我只会使用$pdo-&gt;exec("SET NAMES utf8"); 并放弃其余的。因为 SET NAMES x 相当于 SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;

  • 显示的数据是utf8

    如果显示在 html 页面中,不要忘记设置元标记或标题
    "Content-Type: text/html; charset=utf-8"

【讨论】:

  • 表格排序规则是utf8,插入的数据是utf8,获取的数据是utf8,显示的页面有utf-8 header和utf8 html meta tag,还是不行
  • 从头开始,客户端没有正确提交 utf8 数据
  • 感谢$pdo-&gt;exec("SET NAMES utf8");。它解决了我的问题
猜你喜欢
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多