このドキュメントは、Oracle® 11g/12c データベースから Cloud SQL for MySQL バージョン 5.7 の第 2 世代インスタンスへの移行を計画し、実施する際に必要な情報とガイダンスを提供するシリーズの一つです。このシリーズは次のパートから構成されています。
- Oracle から Cloud SQL for MySQL への移行: 用語と機能
- Oracle から Cloud SQL for MySQL への移行: データ型、ユーザー、テーブル(このドキュメント)
- Oracle から Cloud SQL for MySQL への移行: クエリ、ストアド プロシージャ、関数、トリガー
- Oracle から Cloud SQL for MySQL への移行: セキュリティ、オペレーション、モニタリング、ロギング
データ型
MySQL で提供しているデータ型は、Oracle で提供しているデータ型と完全に同等か、類似しています。次の表に、よく使用される MySQL のデータ型を記載します。その下の表では、Oracle のプリミティブ データ型とそれに対応する MySQL のデータ型を比較します(対応するデータ型が MySQL にない場合は、代替となるデータ型を示しています)。MySQL 5.7 データベースでは、(使用されている文字セットに応じて)行全体のサイズが 65,535 バイトまでに制限されます。
MySQL 5.7 のプリミティブ データ型
| MySQL のデータ型ファミリー | MySQL のデータ型名 | データ型の仕様 | 
|---|---|---|
| 文字列/ 文字 | CHAR(n) | 正確に n文字を格納します。 | 
| VARCHAR(n) | n文字までの可変数の文字を格納します。 | |
| BINARY | 正確に nバイトを格納します。 | |
| VARBINARY(n) | nバイトまでの可変数の文字を格納します。 | |
| BLOB | 可変量のデータを保持できるバイナリラージ オブジェクト | |
| TEXT | VARCHAR特定のバリアント。文字数の上限を指定する必要はありません。 | |
| ENUM | 許可されている値のリストから選択された値を持つ文字列オブジェクト。これらの値は、テーブル作成時に列仕様に明示的に列挙されます。 | |
| SET | ゼロ以上の値を持つことができる文字列オブジェクト。それぞれの値は、テーブルの作成時に指定された許可される値のリストから選択する必要があります。 | |
| 数値 | INT | 最小値: -2147483648 | 最大値: 2147483647 | 
| INTEGER | 最小値: -2147483648 | 最大値: 2147483647 | |
| TINYINT | 最小値: -128 | 最大値: 127 | |
| SMALLINT | 最小値: -32768 | 最大値: 32767 | |
| MEDIUMINT | 最小値: -8388608 | 最大値: 8388607 | |
| BIGINT | 最小値: -2^63 | 最大値: 2^63-1 | |
| DECIMAL(p,s) | p桁と小数点以下s桁の任意の値を格納できます。 | |
| NUMERIC(p,s) | p桁と小数点以下s桁の任意の値を格納できます。 | |
| FLOAT(m,d) | 合計で m桁までの値を格納できます。合計桁数には、小数点以下d桁を含めることができます。 | |
| DOUBLE(m,d) | 合計で m桁までの値を格納できます。合計桁数には、小数点以下d桁を含めることができます。 | |
| BIT(m) | mビットの値を格納します。mの許容範囲: 1~64 | |
| 日付と時刻 | DATE | - 日付部分のみ(時刻部分はない)を含む値。 - 'YYYY-MM-DD'形式のDATE値を取得して表示します。- サポートされる値の範囲: '1000-01-01'~'9999-12-31' | 
| DATETIME | - 日付と時刻の両方の部分を含む値。 - 'YYYY-MM-DD HH:MM:SS'形式のDATETIME値を取得して表示します。- サポートされる値の範囲: '1000-01-01 00:00:00'~'9999-  12-31 23:59:59' | |
| TIMESTAMP | - 日付と時刻の両方の部分を含む値。 - TIMESTAMPの範囲:'1970-01-01
00:00:01'UTC~ '2038-01-19 03:14:07'UTC | |
| TIME | - 値の許容範囲: '-838:59:59'~'838:59:59'- TIME型は時刻(24 時間未満)を表すだけでなく、経過時間または 2 つのイベント間の時間間隔(24 時間を超える場合も、負の値の場合もあります)を表すためにも使用できるため、時間部分はかなり大きい値になることがあります。 | |
| YEAR | - YEAR。年の値を表すために使用する 1 バイトの YEAR 型。- YEARまたはYEAR(n)として宣言できます。表示幅はn文字になります。 | |
| JSON | JSON | データ型としてのテキスト形式の JSON データ | 
| 空間(ジオメトリ) | GEOMETRY | この表の残りの部分で説明するデータモデルを使用する際に指定する列の型。 | 
| POINT | (x,y)値。 | |
| LINESTRING | 行 (pt1, pt2)。 | |
| POLYGON | 実質的に閉路を形成する一連の点。 | |
| MULTIPOINT | POINT値の集合。 | |
| MULTI-LINESTRING | LINE値の集合。 | |
| MULTIPOLYGON | POLYGON値の集合。 | |
| GEOMETRY-COLLECTION | ジオメトリ データ型の集合。 | |
| 論理 | BOOLEAN | - 値として true または false を取ります。 - TRUE、'1'、1などの値は true として使用できます。- 1 バイトのストレージを使用します。 NULLを格納することもできます。 | 
Oracle から MySQL へのデータ型変換
| Oracle のデータ型ファミリー | Oracle のデータ型名 | Oracle のデータ型の仕様 | MySQL と Oracle 間の対応データ型の有無 | MySQL の対応/代替関数 | 
|---|---|---|---|---|
| 文字列/ 文字 | CHAR(n) | 最大サイズ: 2,000 バイト | ○ | CHAR(n) | 
| CHARACTER(n) | 最大サイズ: 2,000 バイト | ○ | CHARACTER(n) | |
| NCHAR(n) | 最大サイズ: 2,000 バイト | ○ | NCHAR(n) | |
| VARCHAR(n) | 最大サイズ: 2,000 バイト | ○ | VARCHAR(n) | |
| NCHAR VARYING(n) | 可変長の UTF-8 文字列。最大サイズ: 4,000 バイト | ○ | NCHAR VARYING(n) | |
| VARCHAR2(n) 11g | 最大サイズ: 4,000 バイト、PL/SQL での最大サイズ: 32KB | × | VARCHAR(n) | |
| VARCHAR2(n) 12g | 最大サイズ: 32,767 バイト MAX_STRING_SIZE=EXTENDED | × | VARCHAR(n) | |
| NVARCHAR2(n) | 最大サイズ: 4,000 バイト | × | VARCHAR(n) | |
| LONG | 最大サイズ: 2GB | ○ | LONG | |
| RAW(n) | 最大サイズ: 2,000 バイト | × | VARBINARY(n) | |
| LONG RAW | 最大サイズ: 2GB | × | LONGTEXT | |
| 数値 | NUMBER | 浮動小数点数 | × | NUMERIC/DECIMAL(p,s) | 
| 数値 | NUMBER | 浮動小数点数 | × | NUMERIC/DECIMAL(p,s) | 
| NUMBER(*) | 浮動小数点数 | × | DOUBLE | |
| NUMERIC(p,s) | 精度の許容範囲: 1~38 | ○ | NUMERIC(p,s) | |
| FLOAT(p) | 浮動小数点数 | ○ | FLOAT(p) | |
| DEC(p,s) | 固定小数点数 | ○ | DEC(p,s) | |
| DECIMAL(p,s) | 固定小数点数 | ○ | DECIMAL(p,s) | |
| INT | 38 桁の整数。 | ○ | INT | |
| INTEGER | 38 桁の整数。 | ○ | INTEGER | |
| SMALLINT | 38 桁の整数。 | ○ | SMALLINT | |
| REAL | 浮動小数点数 | ○ | REAL | |
| DOUBLE PRECISION | 浮動小数点数 | ○ | DOUBLE PRECISION | |
| 日付と時刻 | DATE | 日付と時刻のデータ(年、月、日、時、分、秒)を格納します。 | ○ | DATE | 
| TIMESTAMP(p) | 小数を含む日付と時刻 | ○ | TIMESTAMP | |
| TIMESTAMP(p) WITH TIME ZONE | 小数とタイムゾーンを含む日付と時刻 | × | DATETIME(n) | |
| INTERVAL YEAR(p) TO MONTH | 日付範囲 | × | VARCHAR(n) | |
| INTERVAL DAY(p) TO SECOND(s) | 日付と時刻の間隔 | × | VARCHAR(n) | |
| 論理 | BOOLEAN | TRUE、FALSE、NULLの値。データベース テーブル列に割り当てることはできません。 | ○ | BOOLEAN | 
| XML | XMLTYPE | XML データ。 | × | LONGTEXT | 
| LOB | BFILE | バイナリ ファイルへのポインタ。最大サイズは 4 GB です。 | × | VARCHAR(255) | 
| CLOB | ファイルサイズが最大 4 GB バイトまでの文字ラージ オブジェクト | × | LONGTEXT | |
| BLOB | 最大 4 GB までのバイナリラージ オブジェクト。 | ○ | BLOB | |
| NCLOB | 最大ファイルサイズが 4 GB の可変長の Unicode 文字列。 | × | LONGTEXT | |
| ROWID | ROWID | 物理行アドレス | × | CHAR(n) | 
| UROWID(n) | 論理行アドレスのユニバーサル行 ID。 | × | VARCHAR(n) | |
| 空間 | SDO_GEOMETRY | 空間オブジェクトのジオメトリに関する説明 | × | N/A | 
| SDO_TOPO_GEOMETRY | トポロジのジオメトリの説明 | × | N/A | |
| SDO_GEORASTER | ラスター グリッドまたは画像オブジェクトは単一行に格納されます。 | × | N/A | |
| メディアの種類 | ORDDicom | 音声データの保管と管理をサポートします。 | × | N/A | 
| ORDDicom | Digital Imaging and Communications in Medicine(DICOM)形式のデータの保管と管理をサポートします。 | × | N/A | |
| ORDDoc | メディアデータの保管と管理をサポートします。 | × | N/A | |
| ORDImage | 画像データの保管と管理をサポートします。 | × | N/A | |
| ORDVideo | 動画データの保管と管理をサポートします。 | × | N/A | 
ユーザー定義型
Oracle ではユーザー定義型(UDT)を OBJECT TYPES と呼んでいます。オブジェクト型の管理には PL/SQL が使用されます。ユーザー定義型では、組み込みの Oracle データ型リストに含まれるデータ型を拡張してアプリケーション専用の複雑なデータ型を作成できます。
次に、Oracle の UDT の例を示します。
SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
     PHONE_NUM VARCHAR2(11));
変換に関する注記
MySQL では専用の定義型を作成することはできません。
ユーザーとテーブル
このセクションでは、ユーザーを作成して権限を割り当てる方法と、Oracle テーブルを Cloud SQL for MySQL テーブルに変換する必要性について説明します。
ユーザーの作成と権限
Oracle データベース ユーザー アカウント(Oracle での「ユーザー」と「スキーマ」は同じです)は認証とデータベース セッションへの接続に使用できますが、承認アクセスについては、特定のデータベース オブジェクト / 権限に対してエンドユーザーごとに設定されます。
通常、データベース ユーザーには次の 2 種類があります。
- 管理者: データベース インスタンス、ユーザー、リソースを管理します。
- ユーザー アカウント: アプリケーションなどの論理オペレーションを提供します。
管理者は、ユーザー アカウントとアプリケーション ユーザー アカウントにデータベース オブジェクトへのアクセス権限を付与します。Oracle データベース権限は、特定のオペレーション(セッションの作成や接続など)または特定のデータベース オブジェクト(特定のテーブルに対する SELECT や特定のストアド プロシージャの EXECUTE など)に対してユーザーに付与されます。
変換に関する考慮事項
- MySQL の CREATE USER構文は Oracle とは異なるため、そのまま移行することはできません。MySQL と Oracle のデータベースではユーザー アーキテクチャも異なります。
- 管理者は MySQL のユーザーを作成する際に、ユーザーがデータベースへのアクセスで使用する接続先サーバーを指定しなければなりません。サーバーは特定の IP アドレスまたは DNS で指定できます。ワイルドカードの % 記号を使用してすべてのソースからの接続を許可することもできます。
- MySQL ユーザー名は、ユーザーの名前とそのユーザーの接続元サーバーの 2 つの部分からなります。そのため、名前は同じでも、クライアント アドレス(IP / DNS)として別のサーバーから接続するユーザーを作成できます。
- ユーザーが作成された後、そのユーザーに、特定のデータベースまたはスキーマに含まれるデータベース オブジェクトに対する権限を付与できます。
- Cloud SQL for MySQL で許可されている権限に応じて追加権限をユーザーに付与することもできます(たとえば、root ユーザーには SUPER権限とFILE権限を除くすべての権限が割り当てられます)。Oracle ユーザーは専用のテーブルスペースに関連付けることができますが、この機能は MySQL には関係しません。
テーブル
Oracle のテーブルは多数の要素からなります。たとえば、列のデータ型、テーブル制約、インデックス、パーティション、Oracle 独自のテーブル機能などの要素です。Cloud SQL for MySQL データベースのテーブルに正常に移行するには、すべての Oracle テーブル要素を MySQL テーブルに変換する必要があります。要素の中にはそのまま移行できるものや、わずかな変更ですむものがありますが、完全に変更しなければならない要素もあります。
移行の観点では、PL/SQL を MySQL に変換するにはより多くの作業が必要になりますが、Oracle テーブルから MySQL テーブルへの変換は、将来的にパフォーマンスとデータサイズに影響を及ぼす非常に重要な段階です。
Oracle テーブルと MySQL テーブルの主な違いと関連機能は次のとおりです。これらの違いについては、このシリーズの残りのパートで説明します。
- 大文字と小文字の区別(テーブル名と列名)
- テーブル作成の構文
- テーブルとインデックスのメタデータ
- 制約のサポート
- データ型のサポートと制限事項
- インデックス
- パーティションとパーティション管理
- テーブルとインデックスのメンテナンス
- 一時テーブル
- ビュー
- 表示列と非表示列(Oracle 12c)
- テーブルと列の文字セット