java - 同时支持Oracle和MySQL : how similar is their SQL syntax?

标签 java sql mysql oracle ibatis

我们在一个项目中使用 Oracle,并且希望也支持 MySQL。他们的 SQL 方言有多接近?

是否有可能在没有太多体操的情况下对两者使用相同的 SQL 源代码?

详细信息:

  • 我们使用的是 iBatis,这是一种持久性管理器,可以将 SQL 语句干净地隔离到资源文件中。但我们在 SQL 级别工作,这有其优势(和劣势)。
  • 我们不希望迁移到像 Hibernate 这样的对象关系映射器,因为它会完全保护我们免受方言差异的影响。
  • 我们努力保持 Oracle SQL 的通用子集。
  • 没有 PL/SQL。
  • 我们不使用存储过程或触发器(无论如何)。
  • 我们使用检查约束、唯一约束和外键约束。
  • 我们使用 ON DELETE CASCADE。
  • 我们使用事务(在 iBatis API 级别完成)。
  • 我们在查询中调用了一些 Oracle 时间戳函数。
  • 我们将结合使用 InnoDB 存储引擎和 MySQL(它支持事务和约束)。

那么你的想法是什么?我们是否需要维护两组不同的 iBatis SQL 资源文件,每个方言一个,或者是否可以使用一组支持 MySQL 和 Oracle 的 SQL?

最后更新:感谢所有的回答,尤其是对 Troels Arvin 差异页面的指点。令人遗憾的是,该标准并不更加标准。对我们来说,问题是 MySQL 自动递增与 Oracle 序列、MySQL LIMIT 与 Oracle Rowumber() 以及可能是一两个奇怪的函数。大多数其他一切都应该很容易传输,模数一些编辑以确保我们使用的是 SQL-92,正如@mjv 指出的那样。更大的问题是某些查询可能需要在每个 DBMS 中进行不同的手动优化。

最佳答案

预计路上会有一些小颠簸,但总体来说应该相对容易。

从您当前使用的功能列表来看,应该只有少数句法或语义差异,通常很容易修复或解决。您不使用 PL/SQL 和/或存储过程这一事实是一个优势。一个好的经验法则是尝试并坚持使用大多数 DBMS 支持的 SQL-92,尤其是 Oracle 和 MySQL。 (请注意,这不是当前的 SQL 标准,即 SQL-2008)。

一些区别:

  • “LIMIT”是一个著名的:为了限制在结果列表中检索的行数,MySQL 使用 LIMIT n,在查询结束时,Oracle 在 WHERE 子句中使用 RowNumber()(这是痛苦的,因为您还需要在 SELECT 列表中引用它...)
  • 有些数据类型不同。我认为主要是 BOOLEAN(但谁使用它 ;-))还有一些我认为与 DATETIME 类型/格式的细微差别。
  • 一些函数名称不同(SUBSTRING 与 SUBSTR 等...)

刚刚发现似乎是 good resource about differences between SQL implementations 的东西.

阅读其他人的回复,是的,DDL,可能是个问题。我不这么认为,可能是因为很多应用程序不需要 DDL,您只需要立即设置数据模式等,然后只需使用 SQL 来查询、添加或更新数据。

关于java - 同时支持Oracle和MySQL : how similar is their SQL syntax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1733273/

相关文章:

用于查找表中最长名称和最短名称的 SQL 查询

mysql - 是否可以自动生成外键插入

ios - 自动同步 iOS 应用程序 (Objective-C) 本地数据库与 MySQL 数据库

java - 使用 SPRING MVC 在 JSP 中显示图像

java - 如何使用 Web 服务根据 GUID 或 UUID 在 Sharepoint 站点中搜索文档?

java - Gradle 只运行一个测试套件

php - 如何制作虚拟栏?

android - 如何在mysql-android中插入图像

java - 用于 Java 数据库管理的开源库

MYSQL:两个计数,一组......更好的方法?