php - PDO 和 Mysql 字符集

标签 php mysql pdo character-encoding

我最近为许多项目切换到 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/

相关文章:

php - 在 Redis 中,如果我需要具有 RPOPLPUSH 功能的排序集怎么办?

php - 如何使用正斜杠 dd/mm/yyyy 验证 DOB 字段

php - 关于重复键更新语法 php/mysql 错误

php - 如何从表中选择所有行?

mysql - PDO BindValue 不起作用,但适用于直接粘贴

php - 在 Wordpress 中获取最近的发布时间

php - 使用 id 作为键,name 作为数组的值

mysql - Node.js 连接到 MySQL Docker 容器 ECONNREFUSED

PHP PDO插入方法

php - 在 php 中,我们需要在所有文件中包含还是有更好的方法?