从今天开始,分享Oracle迁移至GBase8a的一些随笔,希望对大家有帮助。
经过一段时间的分析和整理了基于ORACLE数据库的应用系统向GBase 8a数据库迁移的过程中需要注意的问题和对应的方法。
涉及的内容包括数据库迁移和应用程序迁移两部分。
数据库迁移是指对数据库对象的迁移,内容包括数据库对象的差异,数据类型迁移,表达式和操作符迁移,SQL语句迁移,内建函数对比,临时表对比,游标对比,存储过程和函数定义对比,视图对比,触发器对比,Secquence(序列)迁移等。
应用程序迁移是针对使用不同的数据库开发接口所实现的应用程序的迁移。包括ODBC、JDBC、OLE DB、ADO、ADO.NET等开发接口。
-
- 综述
本节的内容用于指导在将ORACLE的表迁移到GBase 8a的表过程中涉及到的ORACLE标准数据类型如何映射到GBase 8a数据库表中。共包含四大类数据类型:
- 二进制数据类型
- 字符数据类型
- 数字数据类型
- 日期时间数据类型。
ORACLE多种标准数据类型及各类自定义类型,大部分内建类型都可以用GBase 8a数据库中的数据类型进行替换,但仍然有一些数据类型(如BFILE、ROWID及自定义的数据类型)没有可映射的标准类型,因此需要根据应用系统的实际需求选择合适的GBase 8a标准数据类型进行替换,并且可能需要相应的调整应用系统中涉及这些类型的部分程序。
-
- 二进制数据类型迁移
GBase8a是面向海量数据的分析处理场景设计的,主要应用于基于海量数据的即席查询、数据仓库处理、数据集市查询等应用。在这类应用中,二进制数据类型即不会作为查询条件,也不会作为操作结果,因此,原则上,GBase8a不支持二进制数据类型。
Oracle中的BFILE、BLOB、RAW(size)、LONGRAW等二进制数据类型在GBase8a中不被支持。
-
- 字符数据类型
- CLOB类型
- 字符数据类型
在ORACLE中用于存储单字节字符的字符串大对象,支持各种定长、变长字符集。最大尺寸为4GB。
GBase 8a可替代的数据类型:
TEXT,但最大尺寸仅为32K。
-
-
- LONG类型
-
保存可变长度的字符串大对象,最大尺寸为2GB。ORACLE推荐用CLOB或NCLOB类型替代该类型。
GBase 8a可替代的数据类型: TEXT,但最大尺寸为32KB。
-
-
- NCHAR(length)类型
-
存储固定长度的Unicode字符。在ORACLE中NATIONAL CHAR(length)、NATIONAL CHARACTER(length)是该类型的同义词。最大尺寸为2000Bytes。
GBase 8a可替代的数据类型:
- 当length的长度<=255字节时,可以使用GBase 8a的CHAR(size)替代(size<255)。
- 当length大于255时,可以使用GBase 8a的VARCHAR(size)替代,size<32766。但这种类型为变长列类型。
-
- NCLOB
-
用于存储Unicode字符集的文本大对象,存储变长字符集的数据(Unicode)。最大尺寸为4GB。
GBase 8a可替代的数据类型:
使用utf8字符集的TEXT,最大尺寸为32KB。
-
-
- CHAR(length)
-
存储固定长度的字符。在Oracle中存储的是数据库字符集的字符。是CHARACTER(length)的同义词。最大尺寸2000Bytes。
GBase 8a可替代的数据类型:
- 当length的长度<=255字节时,可以使用GBase 8a的CHAR(size)替代(size<255)。
- 当length大于255时,可以使用GBase 8a的VARCHAR(size)替代,size<32766。但这种类型为变长列类型。
-
- NVARCHAR2(length)
-
存储变长字符的字符串,等于字符的长度,数据储存在Unicode字符集中。最大长度4000bytes。同义词有NATIONAL CHARACTER VARYING(length), NATIONAL CHAR VARYING(length), NCHAR VARYING(length)。
GBase 8a可替代的数据类型:
使用 utf8 字符集的VARCHAR(length)
-
-
- VARCHAR2(length [BYTE | CHAR])
-
存储变长字符集的字符串,可以按Byte或字符个数来定义长度。最大长度4000Bytes或字符数。同义词有CHAR VARYING(length), CHARACTER VARYING(length), VARCHAR(length)。
GBase 8a可替代的数据类型:
VARCHAR(length)
-
- 数字数据类型
- BINARY_DOUBLE
- 数字数据类型
存储64位的浮点数。
GBase 8a可替代的数据类型:
DOUBLE PRECISION
-
-
- BINARY_FLOAT
-
存储32位的浮点数。
GBase 8a可替代的数据类型:
FLOAT
-
-
- NUMBER(p,s)
-
在一定的精度和范围下存储数字。精度(p)在1-38位10进制的数字,范围(s)可以是 -84 到 127 。这个数字数据可以是任意的固点或浮点数字。如果 p或 s 被指定,那么这个数是一个经过处理的浮点数。如果传入不正确的数字,可能会发生舍入错误。同义词有 DECIMAL, DOUBLE PRECISION, FLOAT, INT, INTEGER, NUMERIC, REAL, SMALLINT。
GBase 8a可替代的数据类型:
DECIMAL(p,s)和INT族类型,在s不为0的情况下,替代为DECIMAL类型,在s为0的情况下,根据p的长度替代为INT族类型。
-
-
- DECIMAL(p,s)
-
标准的 SQL 数据类型,是 Oracle NUMBER(p,s) 同义词。GBase 8a可以使用 DECIMAL(p,s) 数据类型替代。
-
-
- INT, INTEGER
-
标准的 SQL 数据类型,是 Oracle NUMBER(38) 同义词。GBase 8a可以使用 INT, INTEGER 数据类型替代。但GBase 8a中int的最大字节为4字节。
-
-
- NUMERIC(p,s)
-
标准的 SQL 数据类型,是 Oracle NUMBER(p,s) 同义词。GBase 8a可以使用 NUMERIC(p,s) 数据类型替代。
-
-
- REAL
-
标准的 SQL 数据类型,是 Oracle 64 位精度NUMBER 同义词。GBase 8a可以使用DECIMAL(p,s)数据类型替代。
-
-
- SMALLINT
-
标准的 SQL 数据类型,是 Oracle NUMBER(38) 同义词。GBase 8a可以使用 SMALLINT 数据类型替代。
-
- 时间类型
- DATE
- 时间类型
存储日期和时间,范围从公元前 4712 年 1月 1日 到公元 9999 年 12 月 31 日。
GBase 8a可替代的数据类型:
DATETIME,但要注意的是 GBase 8a 的时间范围是从公元 1000 年 1 月 1 日 到 公元 9999 年 12 月 31 日。
-
-
- TIMESTAMP[(precision)]
-
存储日期值,包括年、月、天、小时、分、秒,precision 表示了秒字段的数字位数。precision 字段的范围是 0 到 9 默认值是 6 。
GBase 8a可替代的数据类型:
TIMESTAMP,但要注意的是 GBase 8a 时间类型只精确到秒,其范围是公元 1970 年 1 月 1 日 0时 0 分 1 秒到 公元 2038 年 01 月 19 日 03 时 14分 07 秒。