【问题标题】:Handling MySQL Backticks When Switching DB engines using PHP's PDO Interface使用 PHP 的 PDO 接口切换数据库引擎时处理 MySQL 反引号
【发布时间】:2010-03-03 17:02:27
【问题描述】:
  1. 我目前正在开发一个使用 MySQL 数据库作为后端的 PHP 应用程序
  2. 我的所有查询都包含反引号以转义字段名称。这样我就可以在查询中包含“密码”之类的字段而不会引起问题(参见示例)
  3. 我知道反引号在关系数据库引擎之间并不通用(例如,SQLite 使用双引号)
  4. 我的 php 应用程序中的所有查询都是使用 PHP 的 PDO 接口执行的

我的问题是:如果我想切换数据库引擎,比如从 MySQL 切换到 SQLite,我需要做什么来处理所有查询中的反引号?我真的不想遍历我的所有代码并更改/删除反引号。有什么建议么?我做错了什么或不在最佳实践的范围内?

示例查询:

SELECT
   `username`,
   `password`,
   `email_address`
FROM
   `users`
WHERE
   `id` = '1'

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    其实password真的不需要加引号……连保留字都不是:http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html

    恕我直言,您可以采取的最佳方法是:

    1. 请勿在标识符中使用保留字。
    2. 从当前代码中删除引号;使用任何体面的编辑器都是 2 分钟的任务(除非您还使用反引号运算符)

    无论如何,切换到另一个数据库引擎是一回事;构建独立于 DB 的应用程序是一个完全不同的问题。

    【讨论】:

    • 这是个中肯的建议,我将从现在开始做。
    【解决方案2】:

    不要使用保留字,不使用反引号也不会惹上麻烦。摆脱所有反引号,它不是 SQL 标准,所有其他数据库都会有问题。标准中使用双引号,大多数数据库都支持它们。但同样,不要使用保留的词,你不需要它们。

    将您的 MySQL 服务器 (-connection) 配置为使用 ANSI-QUOTES,并且 MySQL 也将处理双引号,因为它本来应该这样做:作为标识符

    【讨论】:

    • 使用保留字作为字段名称是否被认为是“坏习惯”?我使用“密码”作为字段名称的原因是因为它是对该字段所包含内容的最清晰、最简洁的描述。我对其他字段(例如日期)执行相同的操作(我使用了“created_at”与“date_time_created”)。我愿意接受建议/更正。任何建议表示赞赏。
    • 避免保留字是不切实际的。我刚开始在 sqlite3 上玩一个表,它有一个名为 release 的列,它没有问题。当我在 mysql 上尝试进行相同的交叉检查时,它有问题,可能是因为它是保留字。我当然可以改名,但如果我没有尝试过 mysql,我根本不会知道。
    • RELEASE 也是 SQLite 中的一个关键字:sqlite.org/lang_keywords.html 它在 SQL:2008 关键字列表中。
    【解决方案3】:

    其实,SQLite 是兼容 MySQL 反引号的。

    然而,只有当你遵循@Frank 的建议时,反之才成立。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2017-12-07
      相关资源
      最近更新 更多