我最近为许多项目切换到PDO(使用mysql / i驱动程序太多时间被告知)并且遇到了PDO Mysql驱动程序和charset的奇怪行为。
我在StackOverflow上发现,使用pdo和mysql初始化utf8连接的正确方法是在DSN的末尾添加Charset=utf8
。然而,这个参数在5.3.6之前的php版本中被默默忽略。
因为我正在开发一个cms,我不知道它会在哪个环境上运行;我正在寻找一种解决方案,使其兼容。
我找到的第一个答案是使用$PDO->exec("SET NAMES utf8");
发出查询不一样,因此,它会使转义功能陷入困境。
第二个答案是将PDO::MYSQL_ATTR_INIT_COMMAND
设置为SET NAMES utf8
,那么这与以前不一样吗? (等断开逃脱功能?)
实际上我对此感到有点困惑,所以我决定寻求帮助。我还想到了两个解决方案:
1)构建一个抽象层,如果是PHP< 5.3.6使用mysqli驱动程序
2)每次数据通过套接字
时,使用另一个字符集并进行编码/解码由于
答案 0 :(得分:0)
只是不要打扰。
事实上,utf-8
使用完全与默认latin1
相同的转义规则。
所以,它不会搞乱逃生功能。更不用说你根本不应该手动使用它们(尽管它们在仿真模式下以静默方式使用)。
只要您为自己的网站使用utf-8,只需在DSN中保留charset
并将$PDO->exec("SET NAMES utf8");
置于兼容性状态,您就可以了解所有可能的案例。
“弄乱逃脱功能”的另一个问题是,您可以关闭仿真模式,因此,只要您使用占位符来表示您的数据查询,
$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
no escaping would be involved ever. - 所以,根本不用担心。