Oracle を MySQL に変換
SQL Developer の Database Export または SQLcl が書き出した、テーブルと Insert 文を含む .sql ファイルをドロップすると、同じテーブル、キー、インデックス、データを持つ MySQL スクリプトをダウンロードできます。MySQL がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。
18 行を変換、修正なし、却下なし
shop_2024_oracle.sql のテーブルOracle のダンプ · SQL Developer で作成 · utf-8
customers8 行
7 列 id bigint not null name varchar(100) not null email varchar(150) not null country char(2) not null is_active smallint not null signed_up datetime created_at datetime not null orders10 行
9 列 id bigint not null customer_id bigint not null invoice bigint status varchar(10) not null total decimal(10,2) not null items int not null ordered_at datetime not null shipped_at datetime note varchar(255)
-- Written by IntoSQL from a Oracle dump. Load it with: mysql --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';
CREATE TABLE `customers` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`email` varchar(150) NOT NULL,
`country` char(2) NOT NULL DEFAULT 'US',
`is_active` smallint NOT NULL DEFAULT 1,
`signed_up` datetime,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `customers_email_uk` (`email`),
CONSTRAINT `check1` CHECK (`is_active` IN (0, 1))
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT,
`customer_id` bigint NOT NULL,
`invoice` bigint,
`status` varchar(10) NOT NULL DEFAULT 'pending',
`total` decimal(10,2) NOT NULL,
`items` int NOT NULL DEFAULT 1,
`ordered_at` datetime NOT NULL,
`shipped_at` datetime,
`note` varchar(255),
PRIMARY KEY (`id`),
KEY `orders_status_date_ix` (`status`,`ordered_at`),
CONSTRAINT `check1` CHECK (`status` IN ('pending', 'paid', 'shipped', 'cancelled')),
CONSTRAINT `orders_customer_fk` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15 00:00:00','2023-01-15 10:24:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03 00:00:00','2023-02-03 08:11:42.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (3,'José Peña','jose@example.es','ES',0,'2023-03-21 00:00:00','2023-03-21 19:05:17.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (4,'李雷','lilei@example.cn','CN',1,'2023-05-09 00:00:00','2023-05-09 02:40:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (5,'Noah O\'Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02 00:00:00','2024-01-02 09:30:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29 00:00:00','2024-02-29 23:59:59.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12 00:00:00','2024-04-12 12:12:12.000000');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (1,1,1000,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (2,2,1001,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (3,1,1002,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (4,4,1003,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (5,5,1004,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (6,6,1005,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (7,8,1006,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (8,2,1007,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (9,3,1008,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (10,7,1009,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf');
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
修正
修正が必要な箇所はありませんでした。
確認が必要
- 1 個のシーケンスは作成しません。MySQL にはシーケンスがありません。 アプリケーションで必要なら、次の値をテーブルに保持してください。
- orders の "invoice" のデフォルト値は MySQL 用に書き換えられないため (a sequence)、列にデフォルト値はありません。 新しい行に必要なら、手動でデフォルト値を追加してください。
ファイルはこのコンピューター上で変換され、アップロードされることはありません。
その他のサンプル:
Oracle から MySQL で変わること
各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。
BOOLEAN (23ai)
tinyint(1)
MySQL には boolean 列がないため、TRUE と FALSE は 1 と 0 になります。
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG
1024 文字までは varchar(n)、それを超えると text 型
Oracle がバイトと文字のどちらで数えていても、長さは文字数で数えるため、すべての値が収まります。
NUMBER, NUMBER(p,s), FLOAT(b)
decimal(p,s)、または bigint
NUMBER はすべての桁を保ちます。精度のない NUMBER で値がすべて 18 桁以内の整数なら 64 ビット整数になり、負のスケールはその桁数を小数点の前に確保します。
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND
Oracle のテキスト (+01-06 など) を持つ varchar(100)
MySQL の TIME は 838 時間までの期間を保持できますが、年や月はありません。テキストならすべての部分を保てます。
レポートの行: type_replaced
DATE, TIMESTAMP(p)
datetime(p)
Oracle の DATE は秒までの時刻を持つため、日付と時刻になります。アメリカ式やドイツ式のセッションでのエクスポートは、日付を時刻や世紀なしで書き出します (DD-MON-RR)。これらを保つには ISO のセッション (SYYYY-MM-DD HH24:MI:SS) でエクスポートしてください。
TIMESTAMP(7) to TIMESTAMP(9)
秒の小数は 6 桁、7 桁目は切り捨て
MySQL はマイクロ秒まで保持します。7 桁目 (100 ナノ秒) は丸めずに切り捨てるため、値が次の秒や日に繰り上がることはありません。
レポートの行: fraction_cut
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE
UTC の datetime(p)
MySQL の TIMESTAMP は 2038 年までしか扱えないため、日時は UTC の datetime として保存します。各値のオフセットにかかわらず同じ時点です。
レポートの行: moments_as_utc
JSON (21c), and CLOB holding JSON
json
JSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。
BLOB, RAW(n), LONG RAW
binary(n)、varbinary(n)、blob 型
バイトはバイトのままです。
ROWID, UROWID, XMLTYPE, SDO_GEOMETRY
text
Oracle 独自の型には同等の型がありません。値はテキストを保ち、ROWID の値も含まれますが、Oracle の外では意味を持ちません。
レポートの行: type_replaced
collations that ignore case (BINARY_CI)
厳密な比較 (utf8mb4_bin)
テーブルは utf8mb4_bin を使うため、Oracle で区別されていた値は一意キーでも区別されます。大文字と小文字を区別しなかった列はその動作を失います。アクセントの規則はバージョンによって異なるため、どのバージョンでも Oracle と一致する _ci 照合順序はありません。
レポートの行: case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assigns
AUTO_INCREMENT、最大の ID の後から継続
コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。
identity columns the target can't count
普通の整数
MySQL が採番するのはテーブルごとに 1 列だけで、キーの先頭の列です。それ以外の列はカウンターなしで値を保ちます。
レポートの行: counter_dropped
CREATE SEQUENCE
作成しない
エクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。
レポートの行: sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)
生成列、PERSISTED なら STORED、それ以外は VIRTUAL
MySQL は同じ式から計算します。エクスポートがこれらの列に書き出した値は含めません。
virtual columns with functions IntoSQL doesn't write, and the || operator
普通の列
MySQL 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、MySQL が計算する値もありません。
レポートの行: generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)
デフォルト値なし
書き換えられないデフォルト値は含めず、レポートに記載します。
レポートの行: default_not_translated
CHECK constraints
変換済み
MySQL 5.7 はチェックせずに保持し、それ以外は各行の読み込み時に検証します。
CHECK constraints with functions IntoSQL doesn't write
作成しない
書き換えられないチェック制約は含めず、レポートに記載します。
レポートの行: check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATE
作成しない
Oracle は既存の行にこれらのチェックを適用しないため、行が違反している可能性があります。
レポートの行: check_not_enforced
function-based, bitmap and domain indexes
作成しない
IntoSQL が書き出すのは列全体に対する b-tree インデックスです。その他は読み込み後に作り直してください。
レポートの行: index_skipped
foreign keys
外部キー、FOREIGN_KEY_CHECKS=0 で読み込み
行はどの順序でも読み込め、その後はキーが新しい行をチェックします。
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones
作成しない
キーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。
レポートの行: foreign_key_skipped
partitioned tables
すべてのパーティションの行を持つ 1 つのテーブル
行は同じです。必要なら MySQL でもう一度テーブルをパーティション分割してください。
レポートの行: partitions_dropped
several schemas in one export
1 つのデータベース、テーブル名の先頭にスキーマ名
MySQL のスキーマはデータベースであり、1 つのデータベースに読み込むエクスポートでは作成できません。1 つのスキーマだけのエクスポートはテーブル名を保ちます。
レポートの行: schemas_merged
NOT NULL columns with values that become NULL
NOT NULL を削除
値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。
レポートの行: not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggers
レポートに記載
コードが PL/SQL で書かれているため、作り直せるよう一覧にします。
レポートの行: not_converted_objects
exports without CREATE TABLE (data only)
値から読み取った型
データのみのエクスポートには行しかないため、型は値から決まります。
レポートの行: no_schema
expressions in INSERT values other than the ones exports write
NULL
データベースを実行しないコンバーターでは、これらを評価できません。エクスポートが書き出す to_date、to_timestamp、TO_CLOB、HEXTORAW などは読み取ります。
レポートの行: expression_value
types IntoSQL doesn't know, and object types
longtext
text はどんな値も保持できます。読み込み後に型を変更してください。
レポートの行: unknown_type
dates before year 1 and time zones given as region names
NULL
MySQL が保存できるのは 1000 年から 9999 年までですが、Oracle は 1 年までさかのぼれます。それらの値は NULL になり、レポートで件数を示します。
レポートの行: date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE
NULL
MySQL の浮動小数点型には NaN や infinity がないため、それらの値は NULL になり、レポートで件数を示します。
レポートの行: invalid_value_null
NUL characters in text
保持
値は NUL 文字をエスケープしてコピーします。
text that isn't valid in its encoding
不正なバイトを置換文字に
スクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。
レポートの行: invalid_utf8_replaced
text decoded twice (ñ)
そのままコピー
スクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。
レポートの行: mojibake_suspected
| Oracle では | MySQL では | レポートの行 |
|---|---|---|
| BOOLEAN (23ai) | tinyint(1)MySQL には boolean 列がないため、TRUE と FALSE は 1 と 0 になります。 | |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | 1024 文字までは varchar(n)、それを超えると text 型Oracle がバイトと文字のどちらで数えていても、長さは文字数で数えるため、すべての値が収まります。 | |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s)、または bigintNUMBER はすべての桁を保ちます。精度のない NUMBER で値がすべて 18 桁以内の整数なら 64 ビット整数になり、負のスケールはその桁数を小数点の前に確保します。 | |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | Oracle のテキスト (+01-06 など) を持つ varchar(100)MySQL の TIME は 838 時間までの期間を保持できますが、年や月はありません。テキストならすべての部分を保てます。 | type_replaced |
| DATE, TIMESTAMP(p) | datetime(p)Oracle の DATE は秒までの時刻を持つため、日付と時刻になります。アメリカ式やドイツ式のセッションでのエクスポートは、日付を時刻や世紀なしで書き出します (DD-MON-RR)。これらを保つには ISO のセッション (SYYYY-MM-DD HH24:MI:SS) でエクスポートしてください。 | |
| TIMESTAMP(7) to TIMESTAMP(9) | 秒の小数は 6 桁、7 桁目は切り捨てMySQL はマイクロ秒まで保持します。7 桁目 (100 ナノ秒) は丸めずに切り捨てるため、値が次の秒や日に繰り上がることはありません。 | fraction_cut |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | UTC の datetime(p)MySQL の TIMESTAMP は 2038 年までしか扱えないため、日時は UTC の datetime として保存します。各値のオフセットにかかわらず同じ時点です。 | moments_as_utc |
| JSON (21c), and CLOB holding JSON | jsonJSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。 | |
| BLOB, RAW(n), LONG RAW | binary(n)、varbinary(n)、blob 型バイトはバイトのままです。 | |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | textOracle 独自の型には同等の型がありません。値はテキストを保ち、ROWID の値も含まれますが、Oracle の外では意味を持ちません。 | type_replaced |
| collations that ignore case (BINARY_CI) | 厳密な比較 (utf8mb4_bin)テーブルは utf8mb4_bin を使うため、Oracle で区別されていた値は一意キーでも区別されます。大文字と小文字を区別しなかった列はその動作を失います。アクセントの規則はバージョンによって異なるため、どのバージョンでも Oracle と一致する _ci 照合順序はありません。 | case_insensitive_collation |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | AUTO_INCREMENT、最大の ID の後から継続コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。 | |
| identity columns the target can't count | 普通の整数MySQL が採番するのはテーブルごとに 1 列だけで、キーの先頭の列です。それ以外の列はカウンターなしで値を保ちます。 | counter_dropped |
| CREATE SEQUENCE | 作成しないエクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。 | sequence_not_converted |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | 生成列、PERSISTED なら STORED、それ以外は VIRTUALMySQL は同じ式から計算します。エクスポートがこれらの列に書き出した値は含めません。 | |
| virtual columns with functions IntoSQL doesn't write, and the || operator | 普通の列MySQL 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、MySQL が計算する値もありません。 | generated_not_translated |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | デフォルト値なし書き換えられないデフォルト値は含めず、レポートに記載します。 | default_not_translated |
| CHECK constraints | 変換済みMySQL 5.7 はチェックせずに保持し、それ以外は各行の読み込み時に検証します。 | |
| CHECK constraints with functions IntoSQL doesn't write | 作成しない書き換えられないチェック制約は含めず、レポートに記載します。 | check_skipped |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | 作成しないOracle は既存の行にこれらのチェックを適用しないため、行が違反している可能性があります。 | check_not_enforced |
| function-based, bitmap and domain indexes | 作成しないIntoSQL が書き出すのは列全体に対する b-tree インデックスです。その他は読み込み後に作り直してください。 | index_skipped |
| foreign keys | 外部キー、FOREIGN_KEY_CHECKS=0 で読み込み行はどの順序でも読み込め、その後はキーが新しい行をチェックします。 | |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | 作成しないキーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。 | foreign_key_skipped |
| partitioned tables | すべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要なら MySQL でもう一度テーブルをパーティション分割してください。 | partitions_dropped |
| several schemas in one export | 1 つのデータベース、テーブル名の先頭にスキーマ名MySQL のスキーマはデータベースであり、1 つのデータベースに読み込むエクスポートでは作成できません。1 つのスキーマだけのエクスポートはテーブル名を保ちます。 | schemas_merged |
| NOT NULL columns with values that become NULL | NOT NULL を削除値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。 | not_null_relaxed |
| views, synonyms, types, packages, procedures, functions and other triggers | レポートに記載コードが PL/SQL で書かれているため、作り直せるよう一覧にします。 | not_converted_objects |
| exports without CREATE TABLE (data only) | 値から読み取った型データのみのエクスポートには行しかないため、型は値から決まります。 | no_schema |
| expressions in INSERT values other than the ones exports write | NULLデータベースを実行しないコンバーターでは、これらを評価できません。エクスポートが書き出す to_date、to_timestamp、TO_CLOB、HEXTORAW などは読み取ります。 | expression_value |
| types IntoSQL doesn't know, and object types | longtexttext はどんな値も保持できます。読み込み後に型を変更してください。 | unknown_type |
| dates before year 1 and time zones given as region names | NULLMySQL が保存できるのは 1000 年から 9999 年までですが、Oracle は 1 年までさかのぼれます。それらの値は NULL になり、レポートで件数を示します。 | date_out_of_range |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULLMySQL の浮動小数点型には NaN や infinity がないため、それらの値は NULL になり、レポートで件数を示します。 | invalid_value_null |
| NUL characters in text | 保持値は NUL 文字をエスケープしてコピーします。 | |
| text that isn't valid in its encoding | 不正なバイトを置換文字にスクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。 | invalid_utf8_replaced |
| text decoded twice (ñ) | そのままコピースクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。 | mojibake_suspected |
スクリプトを MySQL に読み込む
スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。
mysql --default-character-set=utf8mb4 mydb < oracle.mysql.sql外部キーはダンプが宣言するとおりに作成し、行の読み込み中は FOREIGN_KEY_CHECKS=0 にするため、存在しない行を参照する行があっても読み込みは止まりません。
大きなダンプでは、サーバーと同じマシンでクライアントを実行し、1 行がとても大きい場合は max_allowed_packet を上げてください。
IntoSQL Pro なら、デスクトップアプリやコマンドラインからファイルを MySQL に直接読み込めます。スクリプトを書き出す必要はありません。
Oracle を最適な方法でダンプする
コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。
- SQL Developer で Tools、Database Export を選び、DDL と Insert データ形式を指定します。SQLcl では SET SQLFORMAT INSERT で同じものを書き出せます。
- エクスポートの前に ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' を実行してください。デフォルトの形式では日付が時刻や世紀なしで書き出されます。
- exp や expdp の .dmp ファイルはバイナリです。Oracle データベース (たとえば Docker 上の Oracle Database Free) にインポートし、SQL Developer でエクスポートしてください。
変換されないもの
ビュー、パッケージ、プロシージャ、関数、トリガー、型、シノニムは PL/SQL で書かれています。黙って削除することはなく、レポートに名前で一覧するので、MySQL 向けに書き直せます。
Oracle から MySQL への変換に関する質問
ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ
ダンプはアップロードされますか?
いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。
ダンプはどのくらいの大きさまで扱えますか?
コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。
exp や expdp の .dmp ファイルは変換できますか?
直接はできません。Data Pump と従来の Export は Oracle だけが読めるバイナリ形式で書き出します。任意の Oracle データベース (Oracle Database Free は Docker で動きます) にインポートし、SQL Developer の Database Export または SQLcl でエクスポートしてください。.dmp ファイルを受け取ると、コンバーターがその旨を表示します。
どの Oracle バージョンのエクスポートに対応していますか?
Oracle 11g 以降から SQL Developer と SQLcl で書き出した、DBMS_METADATA のテーブル定義を含むエクスポートです。すべてのテスト用エクスポートは Oracle 21c と 23ai でアメリカ式、ドイツ式、ISO のセッションから作成し、ソースとセル単位で比較しています。
NUMBER、DATE などの Oracle の型はどうなりますか?
NUMBER は decimal に、整数なら bigint、65 桁を超えるとテキストになります。DATE は時刻を保ったまま datetime に、CLOB は longtext、BLOB は blob になり、interval は Oracle のテキストを保ちます。NaN と Infinity は NULL になり、レポートで件数を示します。
IDENTITY 列とシーケンスは保たれますか?
IDENTITY 列は AUTO_INCREMENT になり、最大の ID の後から続きます。MySQL にはシーケンスがないため、シーケンスとそれを使うデフォルト値はレポートに記載します。
PL/SQL のパッケージ、プロシージャ、トリガーはどうなりますか?
データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。
スクリプトはどの MySQL バージョンで読み込めますか?
MySQL 5.7 以降です。すべてのテスト用エクスポートを 5.7 と 9 で読み込み、問題があれば最初のエラーで止まります。