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

发布于 2024-10-04 10:01:22 字数 278 浏览 3 评论 0原文

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

我的问题是如何确保查询字符串适用于所有适配器?主要是带有一些连接等的 CRUD 语句。是否有一个我可以遵循的适用于所有这些的标准?

谢谢 / Tobias

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

I'm creating a tiny activerecord library using PDO and I'm planning to support MySQL, Sqlite and PgSQL.

My question is how I can be sure that the query string works with all adapters? There will mostly be CRUD statements with some joins etc. Is there a standard I can follow that works for all of these?

Thanks
/ Tobias

EDIT: Thanks for all your answers but my question was more about the SQL 'syntax' differences between them.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

江湖正好 2024-10-11 10:01:22

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

  1. 使用占位符(如果您还没有这样做的话)。他们也增加了安全性。
  2. 使用带有值类型的bindParam/bindValue(例如BOOLEANS在SQLite中不存在,但如果与PARAM_BOOL绑定则可以工作)...
  3. 使用MySQL中的存储过程,在PostgreSQL中创建匹配的名称,并使用sqliteCreateAggregate/sqliteCreateFunction在SQLite中定义它们。
  4. 在 PHP 中进行所有参数检查,因为 SQLite 不会执行任何操作(例如验证日期变量)...
  5. 使用 InnoDB for MySQL 获取事务。

注意:通过支持这些截然不同的 RDBM,您可以将数据库降级为数据存储。请记住,SQLite 的功能非常有限。它没有从数字/字符串保存的本机数据类型。例如,它缺少日期处理和间隔等等。所有三个数据库都支持事务,当在数据库外部维护完整性时,事务对于数据完整性至关重要。

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

If you want to write your own DB layer, I'd suggest you:

  1. Use placeholders, if you aren't already. They add security too.
  2. Use bindParam/bindValue with value type (e.g. BOOLEANS don't exist in SQLite but work if bound with PARAM_BOOL)...
  3. Use stored procedures from MySQL, create matching names in PostgreSQL, and define them in SQLite with sqliteCreateAggregate/sqliteCreateFunction.
  4. Do all parameter checking in PHP, because SQLite won't do any (e.g. validate date variables)...
  5. Use InnoDB for MySQL to get transactions.

Note: By supporting these vastly different RDBMs, you're demoting the database to just a data store. Keep in mind that SQLite is very limited. It does not have native data types save from number/string. E.g. it's missing date handling and intervals, and so on. All three databases support transactions, which are essential for data integrity when the integrity is maintained outside the DB.

Edit: Removed mention of MySQL triggers, which are availabe for 5.0.

掌心的温暖 2024-10-11 10:01:22

这里对 zend_db_adapter 有一个简单的介绍 - 我想你想要类似的东西(我发布这个只是作为一个例子,看看其他人如何解决你遇到的问题)

Here you have a simple introduction to zend_db_adapter - i think you want something similar (I posted this just as a example to see how others resolve the problem you have)

晨曦÷微暖 2024-10-11 10:01:22

对于此类问题,我的选择是 ADOdb。虽然我从未真正将它与 PostgreSQL 一起使用过,但它只是让我在一个恰好与 MySQL 一起诞生的项目中保持理智,然后迁移到 SQL Server、SQLite,然后又迁移回 SQL Server。

My choice for this kind of issues would be ADOdb. While I never actually used it with PostgreSQL, it just saved my sanity in a project that happened to be born with MySQL and then migrated to SQL Server, to SQLite and back to SQL Server.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文