【发布时间】:2010-05-14 17:44:52
【问题描述】:
不同的数据库在 SQL 的实现上略有不同。 PDO 会处理这个吗?
如果我编写一个与 PDO 一起使用的 SQL 查询来访问 MySQL 数据库,然后告诉 PDO 开始使用不同类型的数据库,该查询会停止工作吗?还是 PDO 会“转换”查询以使其继续工作?
如果 PDO 不这样做,是否有任何 PHP 库允许我根据特定语法编写 SQL,然后该库将处理转换 SQL 以便它可以在不同的数据库上运行?
【问题讨论】:
不同的数据库在 SQL 的实现上略有不同。 PDO 会处理这个吗?
如果我编写一个与 PDO 一起使用的 SQL 查询来访问 MySQL 数据库,然后告诉 PDO 开始使用不同类型的数据库,该查询会停止工作吗?还是 PDO 会“转换”查询以使其继续工作?
如果 PDO 不这样做,是否有任何 PHP 库允许我根据特定语法编写 SQL,然后该库将处理转换 SQL 以便它可以在不同的数据库上运行?
【问题讨论】:
来自 PHP 手册:
PDO 提供数据访问抽象 层,这意味着,无论 你正在使用哪个数据库,你使用 发出查询的相同功能 并获取数据。 PDO 不提供 数据库抽象; 它没有 重写 SQL 或模拟缺失 功能。你应该使用一个 成熟的抽象层,如果你 需要那个设施。
因此,您不能更改数据库并期望一切都像以前一样工作。这取决于您使用的查询。它们是“简单”的 SQL92 查询,还是针对特定数据库使用特殊功能......
例如,必须重写具有“LIMIT 10,20”的 mysql 查询才能使用 Oracle DB 或 Sqlite。他们使用“LIMIT 20 OFFSET 10”
【讨论】:
PHP 没有自动为您转换 SQL 的库。如果你想要那种功能,你应该看看像 Doctrine 这样的ORM 实现。当然要付出代价,因为在项目中使用它需要学习曲线,而且编写 SQL 不再像编写字符串那样简单。您应该问自己是否绝对需要独立于数据库的代码。
【讨论】: