2

我想编写一个 SQL 脚本,它将在 MySQL 或 PostgreSQL(分别为 5.5 和 9.0 版)的默认安装上运行。这可能吗?
我几乎可以通过添加SET SESSION sql_mode='ANSI';到脚本的开头并使用标准 ANSI 查询来做到这一点,但该行对 PostgreSQL 无效。我可以告诉 PostgreSQL 继续处理错误,但最好有一个运行无错误的脚本。

4

5 回答 5

4

是否可以为 MySQL 和 PostgreSQL 编写 SQL 脚本?

是的。

下一个问题,拜托!

...

好吧,说真的,这是完全可行的,你必须意识到每个人的不同之处。例如,如果您需要bytea在 PG 中使用 a,但BLOB在 MySQL 中使用 a,那么您将获得正确的编码/转义,这将非常有趣。然后是全文搜索之类的东西。PG 内置了它,MySQL 只内置了一种表类型(MyISAM,最糟糕的一种),并且语法完全不同。这甚至不涉及字符集和排序规则。

如果您将自己限制为简单的 CRUD 操作,那么您可能会很高兴。哎呀,如果你的工作做得对,你也可以使用相同的代码与 SQLite 和 MSSQL 对话(当切换到 ANSI 模式时)。

一旦你变得相当复杂,你的代码至少需要了解底层数据库才能解决小的行为和语法差异。重要的是,如果您正确构建它们,您的大部分查询可以在底层数据库之间共享而无需任何修改。

于 2011-02-15T17:30:58.507 回答
3

尝试使用条件注释:

/*! SET SESSION sql_mode='ANSI'; */

PostgreSQL 会忽略它,MySQL 会运行它。有关更多信息,请参阅文档

更新:如果您想包含仅在 PostgreSQL 上而不在 MySQL 上运行的命令,您可以利用 PostgreSQL 支持嵌套注释而 MySQL 不支持的事实。以下示例显示了如何使用它:

/*! SELECT 'MySQL' rdbms_type; */
/*/**/-- */ SELECT 'postgres' AS rdbms_type;

但这可能会使文件非常难以阅读。

于 2011-02-15T19:26:07.397 回答
1

我认为您可以进行一对一的功能比较。我没有阅读整个链接,但我认为它可能对您的任务有用。

http://troels.arvin.dk/db/rdbms/

于 2011-02-15T17:26:20.790 回答
1

在服务器中设置模式而不是在脚本中:

您可以通过使用 --sql-mode="modes" 选项启动 mysqld 或在 my.cnf(Unix 操作系统)或 my.ini(Windows)中使用 sql-mode="modes" 来设置默认 SQL 模式。

http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html

显然,在脚本中,您将使用两者都接受的功能的最低共同支配者。众所周知,MySQL 具有最符合标准的解析器,但这并不意味着它实际上意味着它会做任何事情(获得 Gotcha 的好方法,因为脚本都可以工作,但行为可能完全不同)。Postgresql 也不符合“ansi”标准。它可能是最接近的,但它有很多独特的东西。似乎不是一个理想的方式。

ORM 也在努力做同样的事情——消除痛苦。

于 2011-02-15T19:10:54.250 回答
0

添加

SET SESSION sql_mode='ANSI';

没有条件 (?) 解决了 ulogin php 库安装问题。use database;如果您已经在命令行上创建了它,添加它也很有帮助。

于 2017-06-19T22:28:24.963 回答