我们在一个项目中使用 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/