ホームページ > バックエンド開発 > PHPの問題 > MySQL から Oracle にデータを移行する際の考慮事項

MySQL から Oracle にデータを移行する際の考慮事項

高洛峰
リリース: 2023-02-22 17:36:00
オリジナル
2712 人が閲覧しました

MySQLからOracleへデータを移行する際の注意点

1. 自動増加するデータ型の扱い

MYSQLには、レコード挿入時にこのフィールドを操作する必要はなく、データ値が自動的に取得されます。 ORACLE には自動増加するデータ型がありません。レコードを挿入するときは、このフィールドにシーケンス番号の次の値を割り当てる必要があります。

CREATE SEQUENCE シリアル番号の名前 (できればテーブル名 + シリアル番号マーク)

INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;

INSERT ステートメントは、このフィールド値を次のように挿入します: シリアル番号の名前.NEXTVAL

2. 一重引用符の処理

MYSQL では二重引用符を使用して文字列をラップできますが、ORACLE では一重引用符のみを使用して文字列をラップできます。文字列を挿入または変更する前に、一重引用符を置換する必要があります。つまり、出現する一重引用符をすべて 2 つの一重引用符に置き換えます。もちろん、Convert Mysql to Oracle ツールを使用する場合は、この問題を考慮する必要はありません

3. 長い文字列の処理

ORACLE では、INSERT および UPDATE 中に操作可能な最大文字列長は以下です。 4,000 のシングルバイト。より長い文字列を挿入したい場合は、フィールドに CLOB タイプを使用し、ORACLE に付属の DBMS_LOB パッケージからメソッドを借用することを検討してください。変更されたレコードを挿入する前に、空でないことと長さを判断する必要があります。空にできないフィールド値や長さを超えるフィールド値は警告を発行し、最後の操作に戻る必要があります。

4. ページめくり SQL ステートメントの処理

MYSQL によるページめくり SQL ステートメントの処理は、LIMIT を使用して位置を開始し、番号を記録します。 ORACLE のページング SQL ステートメントの処理はさらに複雑です。各結果セットには、その位置を示す ROWNUM フィールドが 1 つだけあり、ROWNUM80 は使用できません。

以下は、分析後の 2 つのより優れた ORACLE ページング SQL ステートメントです (ID は一意のキーワードのフィールド名です):

ステートメント 1:

SELECT ID, FIELD_NAME,... .

FROM TABLE_NAME

WHERE ID IN (SELECT ID

FROM (SELECT ROWNUM AS NUMROW, ID

FROM TABLE_NAME

WHERE 条件 1

ORDER BY 条件 2)

WHERE NUMROW > 80

AND NUMROW ORD ER BY 条件 3 ;

ステートメント 2:

SELECT *

FROM ((SELECT ROWNUM AS NUMROW, c.*

from (select FIELD_NAME,.. .

FROM TABLE_NAME

WHERE 条件 1

ORDER BY 条件 2 ) c ) WHERE NUMROW > 80 AND NUMROW ORDER BY 条件 3;

5. 日付フィールドの処理

ORACLE の日付フィールドは、年と月を含む DATE のみを持ちます。日、時、分、秒の情報には、秒まで正確な現在のデータベースのシステム時刻を SYSDATE として使用します。

日付フィールドの数式は大きく異なります。

MYSQL は、DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY) を使用します。

ORACLE は、DATE_FIELD_NAME >SYSDATE - 7;

6 を使用します。 MYSQL では、「% string%」のようなフィールド名を使用します。 '。ORACLE では、'% string%' のようなフィールド名も使用できます。ただし、このメソッドはインデックスを使用できないため、文字列比較関数 instr(field name ,'String')>0 を使用すると、さらに多くの値が得られます。正確な検索結果。

7. null 文字の処理

MYSQL の空でないフィールドにも空のコンテンツがあり、空のコンテンツは許可されません。 MYSQL の NOT NULL に従って ORACLE テーブル構造を定義すると、データのインポート時にエラーが発生します。そのため、データをインポートする際には、NULL文字であるかどうかを判断し、NULL文字である場合は空白文字に変更する必要があります。

Oracleをmysqlに移植する際の注意点

お客様が使用しているデータベースがmysqlであり、開発した製品がoracleをサポートしているため、データベース環境をoracleからmysqlに移植する必要があります。移行プロセス中に次の問題が発生しました。初期設計およびコーディング プロセスでデータベースの移植性に注意を払っていれば、この場合は追加の作業を行う必要はありません。

1. Oracle から MySQL にデータベース環境を移植するときに発生する問題

1. 大文字と小文字の区別 (サーバー OS が Linux の場合)

一般に、Oracle は大文字と小文字を区別しません。 Oracle を使用する場合、テーブル名とフィールド名は大文字と小文字が区別されないことがあります。このように、insert into tableName と insert into TABLENAME は同じ効果を持ちます。データの初期化スクリプトを実行すると、取得された結果は通常、大文字のテーブル名とフィールド名に変換されます。

しかし、MySQL では、使用されるオペレーティング システムの大文字と小文字の区別によって、データベース名とテーブル名の大文字と小文字の区別が決まります。データベースはデータ ディレクトリ内のディレクトリに対応し、データベース内の各テーブルはデータベース ディレクトリ内の少なくとも 1 つのファイル (ストレージ エンジンによっては複数の場合があります) に対応します。したがって、データベースまたはテーブルの使用は実際にはこれらのファイル (フォルダー) を操作することになるため、オペレーティング システムの大文字と小文字の区別によってデータベース名とテーブル名の大文字と小文字の区別が決まります。 Linux をカーネルとして使用するオペレーティング システムでは、大文字と小文字が区別されます。

解決策は、MySQL のデータベース名を Oracle の場合と一致させ、テーブル名をアプリケーションの SQL 文字列のテーブル名と一致させることです。アプリケーションのフィールド名に二重引用符が使用されている場合は、二重引用符を含めてください。 SQL フィールド名の大文字と小文字は、二重引用符内の文字と一致している必要があります。アプリケーションが参照するテーブル名とフィールドの大文字小文字が統一されていない場合、大きな問題が発生します。

2. 予約語の違い

例えば、SQL言語の関数名(inteval、showなど)は予約語です。 Oracle の予約語はテーブル名およびフィールド名として使用でき、その使用には影響しません。ただし、MySQL の予約語をテーブル名およびフィールド名として使用すると、構文エラーが報告されます。

解決策は、SQL ステートメント内の予約語を「`」記号で囲むことです。これは、キーボードのタブ キーの上にあり、それがフィールド名の場合は、別のメソッド tablename.field name があります。このように:

insert into tablename (id, `interval`) value(…..

または

insert into tablename (id, tablename.inteval) value(…..

3. 自動拡張タイプの違い

Oracle にはシーケンスがありますが、mysql にはありませんが、auto_increment 属性があります。

場合によっては、Oracle のシーケンスを auto_increment 属性を使用するように変換することで問題を解決できる可能性があります。自動的に増加するデータ用の別のテーブル。

4. データ型の違い

MySQL には、Oracle のような varchar と numeric はありません。解決策は、置き換えることです。

5. インデックスの長さの制限の違い

MySQL 4.1.2 以降、MyISAM と InnoDB のテーブルのインデックスの長さは 1000 バイトを超えることはできません。バイトを超えると、次のようなエラーが報告されます:

エラー 1071 (42000): 指定されたキーが長すぎます; 最大キー長は 1000 バイトです

UTF-8 エンコードの場合、それは長さに相当します。 (UTF8 の 1 文字は 1000 バイト、つまり 3 バイトを占めるため) Oracle のインデックスの長さの制限は MySQL の制限よりもはるかに緩いです

解決策については、インデックスの定義を変更するか、どちらかで説明する必要はありません。

次に、データベースの互換性のために、データベースの設計において注意すべき点は何ですか?すでに使用されており、同時に 2 つのデータベースを維持したくない場合でも、複数のデータベースと互換性があることが製品のセールス ポイントになる可能性があります。

に準拠することが重要です。標準的な使用法

1. 標準的な使用法を遵守し、msyql の '' 記号の使用法など、特定のデータベース固有の使用法を使用しないようにします。別の例として、Oracle を使用してシーケンスを作成する場合があります。 , SELECT seq.nextval FROM DUAL; テーブルにデータを挿入する前に、クエリから取得した値をテーブルに挿入します。この使用法は、シーケンスのないデータベースには適していません。使用する必要がある場合は、完全に使用する必要があります。別の例として、Postgresql には拡張されたページング クエリがありますが、Oracle にはありません。

2. 予約語

データベース設計者は、テーブル名やフィールド名に予約語を使用しないように努める必要があります。

のように、テーブル名とフィールド名の前に「_」を追加して、この方法を使用する人もたくさんいます: create table _tablename (_id integer)。こうすることで、予約語に起因する問題が発生することはありません。

3. データベースの大文字と小文字の区別の問題を回避します

データベースのテーブル名とフィールド名を大文字にするか小文字にするかを選択し、データベースの設計とコーディングのプロセスで完全に統一します。

Convert Oracle to Mysql ツールを使用する場合は、「名前を大文字に変換」オプションの制御に注意してください

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート