支持Oracle和MySQL:它们的SQL语法有多相似?

Jim*_*ans 5 java mysql sql oracle ibatis

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

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

细节:

  • 我们正在使用iBatis,一个将SQL语句干净地隔离到资源文件中的持久性管理器.但我们在SQL级别工作,这有其优点(和缺点).
  • 我们宁愿不转向像Hibernate这样的对象关系映射器,它可以完全保护我们免受方言差异的影响.
  • 我们已经努力保持Oracle SQL的通用子集.
  • 没有PL/SQL.
  • 我们不使用存储过程或触发器(但无论如何).
  • 我们使用检查约束,唯一约束和外键约束.
  • 我们使用ON DELETE CASCADE.
  • 我们使用交易(在iBatis API级别完成).
  • 我们在查询中调用了几个Oracle时间戳函数.
  • 我们将使用带有MySQL的InnoDB存储引擎(它支持事务和约束).

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

最后更新:感谢所有答案,特别是关于Troels Arvin关于差异的页面的指示.令人遗憾的是,标准并不是更好,标准.对我们来说,问题结果是MySQL自动增量与Oracle序列,MySQL LIMIT与Oracle Rowumber(),以及奇数函数或两个.大多数其他一切都应该很容易转移,模拟一些编辑,以确保我们使用SQL-92作为@mjv指出.更大的问题是某些查询可能需要在每个DBMS中进行不同的手动优化.

mjv*_*mjv 9

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

从您当前使用的功能列表中,应该只有少数的synctactic或语义差异,通常很容易修复或解释.您不使用PL/SQL和/或存储过程这一事实是一个优点.一个好的经验法则是尝试坚持大多数DBMS支持的SQL-92,特别是Oracle和MySQL.(注意,这不是SQL-2008的当前SQL标准).

一些差异:

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

刚刚找到了关于SQL实现之间差异好资源.

阅读其他人的回复,是的,DDL,可能是一个问题.我打了折扣,可能是因为许多应用程序不需要DDL,您只需要立即设置数据模式等,然后只需使用SQL查询,添加或更新数据.


RRU*_*RUZ 7

我相信使用MySQL和Oracle维护一组SQL资源文件,在向后兼容性和解决特定问题之间存在一些缺点.最好为每个SQL引擎都有一个sql,从而最大化每个SQL引擎的功能.

在小册子中看起来相同的特征可以以非常不同的方式实现.

看这些例子

限制结果集

MYSQL

SELECT columns
FROM tablename
ORDER BY key ASC
LIMIT n
Run Code Online (Sandbox Code Playgroud)

ORACLE

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
)
WHERE rownumber <= n
Run Code Online (Sandbox Code Playgroud)

限制 - 有抵消

MYSQL

SELECT columns
FROM tablename
ORDER BY key ASC
LIMIT n OFFSET skip
Run Code Online (Sandbox Code Playgroud)

ORACLE

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rn,
    columns
  FROM tablename
)
WHERE rn > skip AND rn <= (n+skip)
Run Code Online (Sandbox Code Playgroud)

您可以检查此不同SQL实现的比较