我遇到过与PDO有关的行为,这与UTF-8编码问题有关。
插入数据时,我需要声明SET NAMES UTF-8,以便正确存储数据。好的,这很好。但是!
当选择数据(和获取结果)时,我特别不能设置名称UTF-8,否则字符会被扰乱。或者,如果我使用集合名称UTF-8作为选择,我需要utf8对结果集进行编码(如转换为iso88591),如果我想正确看到它们。这表明我的页面将被解释为iso88591。但是,如果我将页面缩小为单页应用程序(它的angularjs / PHP slim / pdo设置),相同的功能仍然存在 - $ http.post的pdo init的UTF-8名称,并且显式没有用于select / $的设置名称UTF-8 http.get。此外,如果我在从UTF-8整理表中获取结果后死亡并公开数据,我需要解码它们以查看正确的数据。
我在我的数据库适配器构造中做了这个黑客来解决它,但我宁愿解决整个问题,因为它让我很好奇:
$init = array();
if ($write) {
$init = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
}
$pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS, $init);
一些事实:
还有其他人遇到过类似的行为吗?这是否必须对使用angular(XHR)发送的标头执行某些操作,因为它们是默认的?虽然请求和params在服务器端被正确解释为UTF-8后所以它看起来很遥远。有可能这可能与环境有神秘的联系,因为它不是一个新的虚拟机,而是一个对它有自己调整的本地开发机器。