1

我最近为许多项目切换到 PDO(使用 mysql/i 驱动程序的时间太长了)并且遇​​到了 PDO Mysql 驱动程序和字符集的奇怪行为。我在 StackOverflow 上发现使用 pdo 和 mysql 初始化 utf8 连接的正确方法是Charset=utf8在 DSN 末尾添加。然而这个参数在 5.3.6 之前的 php 版本中被忽略了。由于我正在开发一个cms,我不知道它将在哪个环境中运行;我正在寻找一种使其兼容的解决方案。

我发现的第一个答案是使用$PDO->exec("SET NAMES utf8"); 这与发出查询是否相同,所以它会与转义函数混淆。

第二个答案是设置PDO::MYSQL_ATTR_INIT_COMMANDSET NAMES utf8,所以这不是和以前一样吗?(所以打破转义功能?)

其实我对此有点困惑,所以我决定寻求帮助。我也想到了两种解决方案:

1) 构建一个抽象层,如果 PHP < 5.3.6 使用 mysqli 驱动程序代替

2) 每次数据通过套接字时,使用另一个字符集和编码/解码

谢谢

4

1 回答 1

0

只是不要打扰。

事实上,utf-8使用与 default完全相同的转义规则latin1

所以,它不会弄乱转义函数。更不用说您根本不应该手动使用它们(尽管它们在仿真模式下静默使用)。

只要您的站点使用 utf-8,只需保留charsetDSN 并放入$PDO->exec("SET NAMES utf8");兼容性,您将涵盖所有可能的情况。

“搞乱转义函数”的另一件事是您可以关闭仿真模式,因此,只要您使用占位符在查询中表示您的数据,

$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

永远不会涉及逃跑。——所以,根本不用担心。

于 2013-09-06T15:21:43.637 回答