5

プロジェクトでOracleを使用しており、MySQLもサポートしたいと考えています。彼らのSQL方言はどれくらい近いですか?

体操をあまりしなくても、両方に同じSQLソースを使用することさえ可能でしょうか?

詳細:

  • SQLステートメントをリソースファイルにクリーンに分離する永続マネージャーであるiBatisを使用しています。ただし、SQLレベルで作業します。これには、長所(および短所)があります。
  • 方言の違いから完全に保護するHibernateのようなオブジェクトリレーショナルマッパーに移動したくない。
  • OracleSQLの汎用サブセットを維持するように努めました。
  • PL/SQLはありません。
  • ストアドプロシージャやトリガーは使用しません(とにかく)。
  • チェック制約、一意の制約、および外部キー制約を使用します。
  • ONDELETECASCADEを使用します。
  • トランザクションを使用します(iBatis APIレベルで実行されます)。
  • クエリでいくつかのOracleタイムスタンプ関数を呼び出します。
  • MySQLでInnoDBストレージエンジンを使用します(トランザクションと制約をサポートします)。

それで、あなたの考えは何ですか?方言ごとに1つずつ、2つの異なるiBatis SQLリソースファイルのセットを維持する必要がありますか、それともMySQLとOracleの両方をサポートするSQLの単一のセットを持つことは可能ですか?

最終更新:すべての回答、特に相違点に関するTroelsArvinのページへのポインタに感謝します。標準が標準ではないのは本当に残念です。私たちにとっての問題は、MySQLの自動インクリメントとOracleシーケンス、MySQLLIMITとOracleRowumber()、そしておそらく1つか2つの奇妙な関数であることがわかりました。@mjvが指摘しているように、SQL-92を使用していることを確認するために、他のほとんどすべてを非常に簡単に転送する必要があります。より大きな問題は、一部のクエリを各DBMSで異なる方法で手動で最適化する必要がある場合があることです。

4

5 に答える 5

9

道路にいくつかの小さな凹凸があると予想しますが、全体としては比較的簡単なはずです。

現在使用している機能のリストから、同期またはセマンティックの違いはわずかであるはずです。一般に、修正または説明が簡単です。PL/SQLやストアドプロシージャを使用しないという事実はプラスです。経験則として、ほとんどのDBMS、特にOracleとMySQLの両方でサポートされているSQL-92に固執することをお勧めします。(これはSQL-2008である現在のSQL標準ではないことに注意してください)。

いくつかの違い:

  • 「LIMIT」は有名なものです。結果リストで取得する行数を制限するために、MySQLはLIMIT nを使用し、クエリの最後にOracleはWHERE句でRowNumber()を使用します(これはあなたにとっても苦痛です) SELECTリストで参照する必要があります...)
  • 一部のデータ型は異なります。私は主にブール値だと思います(しかし、これを使用するのは誰ですか;-))また、DATETIME型/形式との微妙な違いもあると思います。
  • 一部の関数名は異なります(SUBSTRINGとSUBSTRなど...)

SQL実装間の違いについての良いリソースと思われるものを見つけました。

他の人からの応答を読むこと、ええ、DDLは問題になる可能性があります。多くのアプリケーションがDDLを必要としないため、データスキーマなどを一度に設定し、SQLを使用してデータのクエリ、追加、または更新を行う必要があるため、割引しました。

于 2009-11-14T04:42:20.007 に答える
7

MySQLとOracleでSQLリソースファイルの単一のセットを維持することには、下位互換性の間に挟まれて特定の問題を解決するといういくつかの欠点があると思います。SQLエンジンごとにSQLを用意して、それぞれの機能を最大化するのが最善です。

パンフレットで同じように見える機能は、実装が大きく異なる場合があります。

これらの例を参照してください

結果セットの制限

MYSQL

SELECT columns
FROM tablename
ORDER BY key ASC
LIMIT n

オラクル

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

制限-オフセットあり

MYSQL

SELECT columns
FROM tablename
ORDER BY key ASC
LIMIT n OFFSET skip

オラクル

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

さまざまなSQL実装のこの比較を確認できます

于 2009-11-14T04:47:22.790 に答える
4

他の人が言及したものに加えて、oracleとmysqlは外部結合をまったく異なる方法で処理します。実際、OracleはmySqlが処理できない構文を提供しますが、Oracleは標準の構文を処理します。

Oracleのみ:

SELECT a.foo, b.bar
  FROM a, b
 WHERE a.foo = b.foo(+)

mySqlとOracle:

SELECT a.foo, b.bar
     FROM a 
LEFT JOIN b 
       ON (a.foo=b.foo)

したがって、いくつかの外部結合を変換する必要がある場合があります。

于 2009-11-16T02:35:44.457 に答える
3

DDLを同じに保つことは間違いなくできません。DMLに関する限り、多くの類似点があります(すべてのデータベースでサポートされている、ANSI SQL標準のコアサブセットがあります)が、いくつかの違いもあります。

まず、MySQLは自動インクリメント値を使用し、Oracleはシーケンスを使用します。これを回避することは可能ですが(自動インクリメントをシミュレートするためのOracle側のシーケンス+トリガー)、それはあります。組み込み関数はまったく異なります。

基本的に、正確に何を使用するかによって、両方に対して1セットのステートメントを保持できる場合とできない場合があります。ちなみに、Hibernate方言を使用しても、同じクエリのセットを常に使用できるとは限りません。HQLは優れていますが、必ずしも十分ではありません。

于 2009-11-14T04:42:24.687 に答える
2

Oracleは、空の文字列をnullとして扱います。MySQLは空の文字列を空の文字列として扱い、null文字列をnull文字列として扱います。

于 2009-11-15T10:22:55.747 に答える