本文档是系列文章中的一篇,该系列提供了关键的信息和指导来帮助计划和执行 Oracle® 11g/12c 数据库到 Cloud SQL for MySQL 5.7 版第二代实例的迁移。本系列文章包含以下部分:
- 将 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 5.7 数据库限制整行最多有 65535 个字节(由所用的字符集而定)。
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 |
- 包含日期部分但没有时间部分的值。 - 检索 DATE 值并以 'YYYY-MM-DD' 格式显示。- 支持的范围是 '1000-01-01' 至 '9999-12-31' 。 |
DATETIME |
- 同时包含日期和时间部分的值。 - 检索 DATETIME 值并以 'YYYY-MM-DD HH:MM:SS' 格式显示。- 支持的范围是 '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 小时),还可表示所用时间或两个事件之间的时间间隔(可能超过 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 |
几何图形数据类型的集合。 | |
逻辑 | 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) |
|
逻辑 | 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) |
|
空间 | 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 数据类型列表并通过该列表进行扩展。
下面是 UDT 的 Oracle 示例:
SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
PHONE_NUM VARCHAR2(11));
转换说明
MySQL 不允许用户创建专用的已定义类型。
用户和表
本部分介绍如何创建用户并为其分配权限,还介绍了将 Oracle 表转换为 Cloud SQL for MySQL 表的必要性。
创建用户并授予权限
Oracle 数据库用户账号(Oracle“用户”和“架构”是相同的)可用于验证和连接到数据库会话,而授权访问是在每位用户的个人级层上针对特定数据库对象和权限设置的。
一般来说,有两种类型的数据库用户:
- 管理员:管理数据库实例、用户和资源。
- 用户账号:提供应用等逻辑操作。
管理员向用户和应用用户账号授予访问数据库对象的权限。针对特定操作(例如创建会话/连接)或特定数据库对象(例如针对特定表的 SELECT
或针对特定存储过程的 EXECUTE
)向用户授予 Oracle 数据库权限。
转换注意事项
- MySQL
CREATE USER
语法与 Oracle 的语法不同,它无法按原样迁移。此外,这两种数据库的用户架构也不同。 - 当管理员在 MySQL 中创建用户时,他们必须指定用户需要连接到哪个服务器来访问数据库。服务器可以是特定的 IP 地址或 DNS,也可以使用通配符 % 从所有源进行连接。
- 由于 MySQL 用户名由用户名和用户的连接源服务器两部分组成,因此可以使用相同的名称创建另一个服务器的用户作为客户地址 (IP/DNS)。
- 创建用户后,可以向该用户授予对特定数据库或架构中的数据库对象的权限。
- 还可以根据 Cloud SQL for MySQL 允许的权限向用户授予其他权限(例如,根用户将拥有除
SUPER
和FILE
特权之外的所有特权)。Oracle 用户可以在使用 MySQL 时连接到专用表空间,因此该功能无关紧要。
表
Oracle 表由列数据类型、表约束、索引、分区、Oracle 表专有功能等诸多元素构建而成。要成功迁移到 Cloud SQL for MySQL 数据库表,必须将所有 Oracle 表元素转换到 MySQL 表中。某些元素无需修改或只需经过细微修改,而其他一些元素必须完全修改。
从迁移的角度来看,将 PL/SQL 转换为 MySQL 可能需要更多的工作量,因为将 Oracle 表转换为 MySQL 表是一个关键阶段,有着至关重要的意义,并且会进一步影响性能和数据大小。
下面是 Oracle 和 MySQL 表以及相关功能的主要差异。本系列的其余部分将讨论这些差异。
- 区分大小写(表名和列名)
- 创建表的语法
- 表和索引元数据
- 约束支持
- 数据类型支持和限制
- 索引
- 分区和分区管理
- 表和索引的维护
- 临时表
- 视图
- 可见列和不可见列 (Oracle 12c)
- 表和列的字符集