我想编写一个 SQL 脚本,它将在 MySQL 或 PostgreSQL(分别为 5.5 和 9.0 版)的默认安装上运行。这可能吗?
我几乎可以通过添加SET SESSION sql_mode='ANSI';
到脚本的开头并使用标准 ANSI 查询来做到这一点,但该行对 PostgreSQL 无效。我可以告诉 PostgreSQL 继续处理错误,但最好有一个运行无错误的脚本。
5 回答
是否可以为 MySQL 和 PostgreSQL 编写 SQL 脚本?
是的。
下一个问题,拜托!
...
好吧,说真的,这是完全可行的,但你必须意识到每个人的不同之处。例如,如果您需要bytea
在 PG 中使用 a,但BLOB
在 MySQL 中使用 a,那么您将获得正确的编码/转义,这将非常有趣。然后是全文搜索之类的东西。PG 内置了它,MySQL 只内置了一种表类型(MyISAM,最糟糕的一种),并且语法完全不同。这甚至不涉及字符集和排序规则。
如果您将自己限制为简单的 CRUD 操作,那么您可能会很高兴。哎呀,如果你的工作做得对,你也可以使用相同的代码与 SQLite 和 MSSQL 对话(当切换到 ANSI 模式时)。
一旦你变得相当复杂,你的代码至少需要了解底层数据库才能解决小的行为和语法差异。重要的是,如果您正确构建它们,您的大部分查询可以在底层数据库之间共享而无需任何修改。
尝试使用条件注释:
/*! SET SESSION sql_mode='ANSI'; */
PostgreSQL 会忽略它,MySQL 会运行它。有关更多信息,请参阅文档。
更新:如果您想包含仅在 PostgreSQL 上而不在 MySQL 上运行的命令,您可以利用 PostgreSQL 支持嵌套注释而 MySQL 不支持的事实。以下示例显示了如何使用它:
/*! SELECT 'MySQL' rdbms_type; */
/*/**/-- */ SELECT 'postgres' AS rdbms_type;
但这可能会使文件非常难以阅读。
我认为您可以进行一对一的功能比较。我没有阅读整个链接,但我认为它可能对您的任务有用。
在服务器中设置模式而不是在脚本中:
您可以通过使用 --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 也在努力做同样的事情——消除痛苦。
添加
SET SESSION sql_mode='ANSI';
没有条件 (?) 解决了 ulogin php 库安装问题。use database;
如果您已经在命令行上创建了它,添加它也很有帮助。