PDO和Mysql charset

时间:2013-09-06 14:56:51

标签: php mysql pdo character-encoding

我最近为许多项目切换到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)每次数据通过套接字

时,使用另一个字符集并进行编码/解码

由于

1 个答案:

答案 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. - 所以,根本不用担心。