面对激烈的国际竞争和不确定不稳定因素明显上升的外部环境,加快推进国内信息技术产业发展,构建安全、自主的信息技术应用创新体系迫在眉睫。作为国内XC产业数据库领域的领军企业,南大通用推出的OLTP型数据库产品——GBase 8s,已在金融、电信、电力、交通、政府、军工等多个行业用户完成测试,验证了8s的稳定性和性能。GBase 8s是如何兼容Oracle的,让我们从数据类型说起。
Oracle中包含6种字符类型:CHAR、NCHAR、VARCHAR、VARCHAR2、NVARCHAR2、LONG。具体如下:
1)CHAR
CHAR类型,定长字符串,会用空格填充来达到其最大长度。CHAR字段最多可以存储2,000字节的信息。
2)VARCHAR
VARCHAR是标准SQL的写法,可变长字符串,可以存储空字符串。
3)VARCHAR2
变长字符串,与CHAR类型不同,是oracle特有的字段,它不会使用空格填充至最大长度。VARCHAR2最多可以存储4,000字节的信息。
4)NCHAR
包含UNICODE格式数据的定长字符串。NCHAR字段最多可以存储2,000字节的信息。它的最大长度取决于国家字符集。
5)NVARCHAR2
包含UNICODE格式数据的变长字符串。 NVARCHAR2最多可以存储4,000字节的信息。
6)LONG
存储变长字符串,最多达2G的字符数据(2GB是指2千兆字节, 而不是2千兆字符),与VARCHAR2 或CHAR 类型一样,存储在LONG 类型中的文本要进行字符集转换。ORACLE建议开发中使用CLOB替代LONG类型。支持LONG 列只是为了保证向后兼容性。CLOB类型比LONG类型的限制要少得多。
GBase 8s除了LONG和VARCHAR2类型外,对Oracle字符类型全部可以兼容,LONG类型可用CLOB替代,而VARCHAR2建议用VARCHAR替代, NVARCHAR2建议用NVARCHAR替代。此外GBase 8s还支持LVARCHAR类型,变长字符串,默认为2048字节,最大支持32739字节。
Oracle包含5种数字类型:INT、NUMBER、FLOAT、BINARY_FLOAT、BINARY_DOUBLE。具体如下:
1)NUMBER
NUMBER(P,S)是最常见的数字类型,需要1~22字节(BYTE)不等的存储空间。
P 是Precison的英文缩写,即精度缩写,表示有效数字的位数,最多不能超过38个有效数字;S是Scale的英文缩写,可以使用的范围为-84~127。Scale为正数时,表示从小数点到最低有效数字的位数,它为负数时,表示从最大有效数字到小数点的位数。
2)INT / INTEGER
INT是NUMBER的子类型,它等同于NUMBER(38,0),用来存储整数。若插入、更新的数值有小数,则会被四舍五入。
3)FLOAT
一个ANSI数据类型,也是NUMBER的子类型。精度为126位二进制、38位十进制的浮点数。
4)BINARY_FLOAT
BINARY_FLOAT 是 32 位、 单精度浮点数字数据类型,采用二进制精度。可以支持至少6位精度,每个 BINARY_FLOAT 的值需要 5 个字节,包括长度字节。
5)BINARY_DOUBLE
BINARY_DOUBLE 是为 64 位,双精度浮点数字数据类型,采用二进制精度。每个 BINARY_DOUBLE 的值需要 9 个字节,包括长度字节。
GBase 8s除了BINARY_FLOAT和BINARY_DOUBLE类型外需要用DOUBLE PRECISION替代外,对Oracle数值类型全部可以兼容,需要注意的是,GBase 8s中的NUMBER类型以名为NUMERIC的类型出现,区别在于精度不超过32个有效数字,小数点后位数不大于精度位数,此外,GBase 8s还提供MONEY货币值类型,支持用货币字符进行格式化。
GBase 8s中验证如下:
Oracle包含4种时间及日期类型:DATE、TIMESTAMP、INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND。具体如下:
1)DATE
DATE是最常用的数据类型,日期数据类型存储日期和时间信息。虽然可以用字符或数字类型表示日期和时间信息,但是日期数据类型具有特殊关联的属性。为每个日期值,Oracle 存储以下信息: 世纪、 年、 月、 日期、 小时、 分钟和秒。一般占用7个字节的存储空间。
2)TIMESTAMP
这是一个7字节或12字节的定宽日期/时间数据类型。它与DATE数据类型不同,因为TIMESTAMP可以包含小数秒,带小数秒的TIMESTAMP在小数点右边最多可以保留9位。
3)INTERVAL YEAR TO MOTH
用来存储单位为年和月的时间间隔。
4)INTERVAL DAY TO SECOND
用来存储单位为天和秒的时间间隔。
GBase 8s对Oracle日期类型全部可以兼容,但要说明的是,Oracle中的date对应GBase 8s中的datetime year to second,GBase 8s中的date默认仅支持年月日,不支持时分秒,而Oracle中timestamp§则对应GBase 8s中的datetime year to fraction(min(5,p)),最多保留小数点后5位。
Oracle包含4种大对象类型BLOB、CLOB、NCLOB、BFILE,存储长度都为4G。具体如下:
1)CLOB
内部字符大对象,存储单字节和多字节字符数据。支持固定宽度和可变宽度的字符集,常用于大文本的存储。
2)NCLOB
国家语言字符集大对象,存储UNICODE类型的数据,支持固定宽度和可变宽度的字符集。
3)BLOB
内部二进制大对象,存储非结构化的二进制数据大对象,它可以被认为是没有字符集语义的比特流,一般是图像、声音、视频等文件。
4)BFILE
外部二进制文件,存储在数据库外的系统文件,只读的,数据库会将该文件当二进制文件处理。
GBase 8s对Oracle的CLOB和BLOB类型可以兼容,且最大支持4T,但对NCLOB和BFILE类型暂未支持,建议可用CLOB和BLOB替代。此外GBase 8s还另外支持BYTE和TEXT类型,最大均为2G。
除以上常用类型外,Oracle还包含RAW、LONG RAW、ROWID及UROWID类型。具体如下:
1)RAW
用于存储二进制或字符类型数据,变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。这种类型最多可以存储2000字节的信息,建议使用 BLOB 来代替它。
2)LONG RAW
能存储2GB 的原始二进制数据(不用进行字符集转换的数据)。建议使用BLOB来代替它。
3)ROWID
ROWID是一种特殊的列类型,称之为伪列(pseudocolumn)。ROWID伪列在SQL SELECT语句中可以像普通列那样被访问。ROWID表示行的地址,ROWID伪列用ROWID数据类型定义。Oracle数据库中每行都有一个伪列。
4)UROWID
UROWID,它用于表,是行主键的一个表示,基于主键生成。UROWID与ROWID的区别就是UROWID可以表示各种ROWID,使用较安全。一般是索引组织表在使用UROWID。
GBase 8s默认支持ROWID伪列,RAW和LONG RAW类型可用BLOB类型替代。
总结一下,GBase 8s可全面兼容Oracle常见数据类型,对于少数非常用数据类型,需要进行少量代码改造,或进行相应类型替换。