Php mysql、sqlite和pgsql之间的语法差异

Php mysql、sqlite和pgsql之间的语法差异,php,mysql,sqlite,postgresql,pdo,Php,Mysql,Sqlite,Postgresql,Pdo,我正在使用PDO创建一个小型activerecord库,并计划支持MySQL、Sqlite和PgSQL 我的问题是如何确保查询字符串适用于所有适配器?大多数情况下都会有CRUD语句和一些连接等。是否有一个标准可以适用于所有这些语句 谢谢 /托拜厄斯 编辑:感谢您的所有回答,但我的问题更多的是关于它们之间的SQL“语法差异。您对zend_db_adapter有一个简单的介绍-我想您想要类似的东西(我发布这篇文章只是为了看看其他人如何解决您的问题)对于这类问题,我的选择是。虽然我从未在Postgre

我正在使用PDO创建一个小型activerecord库,并计划支持MySQLSqlitePgSQL

我的问题是如何确保查询字符串适用于所有适配器?大多数情况下都会有CRUD语句和一些连接等。是否有一个标准可以适用于所有这些语句

谢谢 /托拜厄斯


编辑:感谢您的所有回答,但我的问题更多的是关于它们之间的SQL“语法差异。

您对zend_db_adapter有一个简单的介绍-我想您想要类似的东西(我发布这篇文章只是为了看看其他人如何解决您的问题)对于这类问题,我的选择是。虽然我从未在PostgreSQL中实际使用过它,但它只是将我的理智保存在一个与MySQL一起诞生的项目中,然后迁移到SQL Server、SQLite和SQL Server。

如果您想编写自己的数据库层,我建议您:

  • 如果还没有占位符,请使用占位符。它们也增加了安全性
  • 使用值类型为的bindParam/bindValue(例如,SQLite中不存在布尔值,但如果与PARAM_BOOL绑定,则可以使用布尔值)
  • 使用MySQL中的存储过程,在PostgreSQL中创建匹配的名称,并在SQLite中使用sqliteCreateAggregate/sqliteCreateFunction定义它们
  • 在PHP中执行所有参数检查,因为SQLite不会执行任何操作(例如验证日期变量)
  • 使用InnoDB for MySQL获取事务
  • 注意:通过支持这些截然不同的RDBMs,您将数据库降级为一个数据存储。请记住,SQLite非常有限。它没有从number/string保存的本机数据类型。例如,缺少日期处理和间隔等。这三个数据库都支持事务,当完整性在数据库外部维护时,事务对于数据完整性至关重要


    编辑:删除了对MySQL触发器的提及,该触发器适用于5.0。

    当然。你总是有可能把自己的双手绑起来,用强大的Postgre创建一个糟糕的sqlite。这种方法的问题是,生成的应用程序在所有平台上都会运行得同样慢,特别是当它是一个非平凡的应用程序时。我更愿意尝试在业务层上进行抽象,并在数据访问层中尽可能利用DBMS特有的功能。@a_horse_with_no_name:对于这样的事情,我总是会做出响应,向我显示性能问题,然后我会使用switch来运行常规查询。因为数据库抽象层而担心性能在我看来是过早的优化;即使在使用抽象层时,我也可以选择运行常规查询。但外键更适合于确保数据完整性。