【问题标题】:PDO and Mysql charsetPDO 和 Mysql 字符集
【发布时间】:2013-09-06 14:56:51
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 不确定您所说的“用转义函数搞砸了”是什么意思。该查询中没有任何内容需要转义。
  • 按照PHP manual 中的说明使用SET NAMES utf8 不会影响mysql(i)_real_escape_string()PDO::quote() 等转义函数
  • 无论如何你都不应该使用手动引用。

标签: php mysql pdo character-encoding


【解决方案1】:

别打扰了。

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

因此,它不会与转义函数混淆。更不用说您根本不应该手动使用它们(尽管它们在仿真模式下被静默使用)。

只要您的网站使用 utf-8,只需将 charset 保留在 DSN 中并输入 $PDO->exec("SET NAMES utf8"); 以保持兼容性,您将涵盖所有可能的情况。

关于“使用转义函数”的另一件事是,您可以关闭 仿真模式,因此,只要您使用 placeholders 来表示您的数据查询,

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

no escaping would be involved ever. - 所以,根本不用担心。

【讨论】:

  • 这不会让我接受注射吗? (当然我也不会直接使用)
  • 如果可以,我不会写我的答案。 utf-8 与 latin1 一样无懈可击。这就是重点。
  • 顺便说一句“以防万一”,你知道其他流行的 CMS 是如何处理这种事情的吗?例如,他们都使用 utf8 还是让管理员在安装时决定?
  • 不,我不太清楚。我认为他们中的大多数人根本不在乎。
猜你喜欢
  • 2014-11-25
  • 2013-11-10
  • 2019-02-07
  • 1970-01-01
  • 2016-11-21
  • 2011-12-21
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多