本文是一系列文章之一,提供有關規劃及執行 Oracle® 11g/12c 資料庫遷移至 Cloud SQL for MySQL 5.7 版本第二代執行個體的相關重要資訊和指引。本系列包含以下部分:
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:術語和功能
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:資料類型、使用者和資料表 (本文)
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:查詢、儲存的程序、函式和觸發事件
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:安全性、作業、監控和記錄
資料類型
MySQL 提供多種資料類型,這些類型與 Oracle 提供的資料類型完全相同或相似。下表列出最常見的 MySQL 資料類型,接著比較 Oracle 原始資料類型與對應的 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' (世界標準時間) 到 '2038-01-19 03:14:07' (世界標準時間)。 |
|
TIME |
- 值的範圍從 '-838:59:59' 到 '838:59:59' 。- 小時部分可能會很大,因為 TIME 類型不僅可用於表示時段 (必須小於 24 小時),還可用於表示兩個事件之間的經過時間或時間間隔 (可能會大於 24 小時,甚至為負值)。 |
|
YEAR |
- YEAR 1 個位元組的類型,用於表示年份值。- 可宣告為 YEAR 或 YEAR(n) ,且顯示寬度為 n 個半形字元。 |
|
JSON | JSON |
文字 JSON 資料做為資料類型。 |
空間 (幾何) |
GEOMETRY |
當您要使用下表中列出的資料模型時,請指定要使用的資料欄類型。 |
POINT |
(x,y) 值。 |
|
LINESTRING |
(pt1, pt2) 行。 |
|
POLYGON |
一系列點,實際上是封閉路徑。 | |
MULTIPOINT |
POINT 值的集合。 |
|
MULTI-LINESTRING |
LINE 值的集合。 |
|
MULTIPOLYGON |
POLYGON 值的集合。 |
|
GEOMETRY-COLLECTION |
幾何圖形資料類型的集合。 | |
Logical | BOOLEAN |
- 可儲存 true 或 false 值。 - 可接受 TRUE 、'1' 和 1 等值,視為 true。- 使用 1 個位元組的儲存空間,可儲存 NULL 。 |
Oracle 到 MySQL 資料類型轉換
Oracle 資料類型群組 | Oracle 資料類型名稱 | Oracle 資料類型規格 | MySQL 與 Oracle 的對應項目 | MySQL 對應/替代 |
---|---|---|---|---|
字串/ 字元 |
CHAR(n) |
大小上限為 2000 位元組。 | 是 | CHAR(n) |
CHARACTER(n) |
大小上限為 2000 位元組。 | 是 | CHARACTER(n) |
|
NCHAR(n) |
大小上限為 2000 位元組。 | 是 | NCHAR(n) |
|
VARCHAR(n) |
大小上限為 2000 位元組。 | 是 | VARCHAR(n) |
|
NCHAR VARYING(n) |
長度可變的 UTF-8 字串,大小上限為 4000 位元組。 |
是 | NCHAR VARYING(n) |
|
VARCHAR2(n) 11g |
大小上限為 4000 位元組,在 PL/SQL 中為 32 KB。 | 否 | VARCHAR(n) |
|
VARCHAR2(n) 12g |
大小上限為 32767 位元組 MAX_STRING_SIZE=EXTENDED 。 |
否 | VARCHAR(n) |
|
NVARCHAR2(n) |
大小上限為 4000 位元組。 | 否 | VARCHAR(n) |
|
LONG |
大小上限為 2 GB。 | 是 | LONG |
|
RAW(n) |
大小上限為 2000 位元組。 | 否 | VARBINARY(n) |
|
LONG RAW |
大小上限為 2 GB。 | 否 | 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) |
|
Logical | BOOLEAN |
值為 TRUE 、FALSE 和 NULL 。無法指派至資料庫資料表欄。 |
是 | BOOLEAN |
XML | XMLTYPE |
XML 資料。 | 否 | LONGTEXT |
LOB | BFILE |
指向二進位檔的指標,大小上限為 4 GB。 | 否 | VARCHAR(255) |
CLOB |
字元大型物件,檔案大小上限為 4 GB。 | 否 | LONGTEXT |
|
BLOB |
二進位大型物件,大小上限為 4 GB。 | 是 | BLOB |
|
NCLOB |
變長式 Unicode 字串,檔案大小上限為 4 GB。 | 否 | LONGTEXT |
|
ROWID | ROWID |
實際資料列位址。 | 否 | CHAR(n) |
UROWID(n) |
邏輯資料列位址的通用資料列 ID。 | 否 | VARCHAR(n) |
|
Spatial | SDO_GEOMETRY |
空間物件的幾何描述。 | 否 | N/A |
SDO_TOPO_GEOMETRY |
說明拓樸結構幾何圖形。 | 否 | N/A |
|
SDO_GEORASTER |
您可以將光柵格線或圖片物件儲存在單一資料列中。 | 否 | N/A |
|
媒體類型 | ORDDicom |
支援音訊資料的儲存和管理。 | 否 | N/A |
ORDDicom |
支援儲存及管理數位醫學影像和通訊 (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 資料表轉換為 MySQL 適用的 Cloud SQL 資料表。
建立使用者和權限
Oracle 資料庫使用者帳戶 (Oracle 的「使用者」和「結構描述」相同) 可用於驗證及連線至資料庫工作階段,而授權存取權則會針對特定資料庫物件和權限,在個別使用者層級設定。
一般來說,資料庫使用者分為兩種:
- 管理員:管理資料庫執行個體、使用者和資源。
- 使用者帳戶:提供邏輯作業,例如應用程式。
管理員會將權限授予使用者和應用程式使用者帳戶,以便存取資料庫物件。您可以為使用者授予 Oracle 資料庫權限,以便執行特定作業 (例如建立工作階段/連線) 或特定資料庫物件 (例如特定資料表上的 SELECT
,或特定儲存程序上的 EXECUTE
)。
轉換考量事項
- MySQL
CREATE USER
語法與 Oracle 語法不同,因此無法直接遷移。此外,兩個資料庫的使用者架構也不同。 - 管理員在 MySQL 中建立使用者時,必須指定使用者需要連線的伺服器,才能存取資料庫。伺服器可以是特定 IP 位址或 DNS,也可以使用萬用字元 % 符號,允許從所有來源連線。
- 由於 MySQL 使用者名稱是使用者名稱和允許使用者連線的伺服器之間的兩部分附件,因此您可以使用相同名稱建立使用者,但使用者名稱的用戶端位址 (IP/DNS) 來自不同的伺服器。
- 建立使用者後,您可以授予使用者存取特定資料庫或結構描述的資料庫物件權限。
- 您也可以根據 Cloud SQL for MySQL 允許的權限,授予使用者其他權限 (例如,超級使用者會獲得
SUPER
和FILE
以外的所有權限)。Oracle 使用者可以在 MySQL 中連結至專屬的資料表空間,因此這項功能不相關。
資料表
Oracle 資料表是由許多元素建構而成,例如資料欄資料類型、資料表限制、索引、區隔、Oracle 資料表專屬功能等等。如要成功遷移至 MySQL 適用的 Cloud SQL 資料庫資料表,所有 Oracle 資料表元素都必須轉換為 MySQL 資料表。部分元素可透過不修改或略微修改的方式轉換,但有些元素則必須完全修改。
從遷移的角度來看,將 PL/SQL 轉換為 MySQL 可能需要付出更多心力,因為將 Oracle 資料表轉換為 MySQL 資料表是相當重要的階段,對效能和資料大小有進一步的影響。
以下是 Oracle 和 MySQL 資料表與相關功能的主要差異。我們會在本系列的後續部分討論這些差異。
- 區分大小寫 (資料表和欄名稱)
- 建立資料表語法
- 資料表和索引中繼資料
- 限制支援
- 支援的資料類型和限制
- 索引
- 分區與分區管理
- 資料表和索引維護
- 臨時資料表
- 瀏覽次數
- 可見和不可見資料欄 (Oracle 12c)
- 資料表和欄位字元集