我最近为许多项目切换到 PDO(使用 mysql/i 驱动程序的时间太多了),遇到了 PDO Mysql 驱动程序和字符集的奇怪行为。
我在 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) 每次通过套接字传递数据时,使用另一个字符集并进行编码/解码
谢谢
最佳答案
别打扰了。
事实上,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. - 所以,完全没有必要担心。
关于php - PDO 和 Mysql 字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18660735/