查看原文
其他

干货分享 | GBase 8s兼容Oracle漫谈——数据类型篇

数据管理小S GBASE数据库 2022-07-03


面对激烈的国际竞争和不确定不稳定因素明显上升的外部环境,加快推进国内信息技术产业发展,构建安全、自主的信息技术应用创新体系迫在眉睫。作为国内XC产业数据库领域的领军企业,南大通用推出的OLTP型数据库产品——GBase 8s,已在金融、电信、电力、交通、政府、军工等多个行业用户完成测试,验证了8s的稳定性和性能。GBase 8s是如何兼容Oracle的,让我们从数据类型说起。


01

字符


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字节。


GBase 8s中验证如下:

● create table t_char(col char);

>>成功;

● create table t_varchar(col varchar);

>>成功;

● create table t_nchar(col nchar);

>>成功;

● create table t_lvarchar(col lvarchar);

>>成功;

● create table t_nvarchar2(col nvarchar2);

>>[-9628]:Type(nvarchar2) not found.

● create table t_varchar2(col varchar2);

>>[-9628]:Type(varchar2) not found.

● create table t_long(col long);

>>[-9628]:Type(long) not found.


02

数字


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中验证如下:

● create table t_number(col numeric);

>>成功;

● create table t_int(col int);

>>成功;

● create table t_float(col float);

>>成功;

● create table t_money(col money);

>>成功;

● create table t_binary_float(col binary_float);

>>[-9628]:Type(binary_float) not found.

● create table t_binary_double(col binary_double);

>>[-9628]:Type(binary_double) not found.


03

时间&日期


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(p)则对应GBase 8s中的datetime year to fraction(min(5,p)),最多保留小数点后5位。


GBase 8s中验证如下:

● create table t_date(col datetime year to second);

>>成功;

● create table t_timestamp(col datetime year to fraction);

>>成功;

● create table t_interval_year_to_month(col interval year to month);

>>成功;

● create table t_interval_day_to_second(col interval day to second);

>>成功;


04

大对象


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。


GBase 8s中验证如下:

● create table t_clob(col clob);

>>成功;

● create table t_blob(col blob);

>>成功;

● create table t_nclob(col nclob);

>>[-9628]:Type(nclob) not found.

● create table t_bfile(col bfile);

>>[-9628]:Type(bfile) not found.


05

其他类型


除以上常用类型外,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中验证如下:

● create table t_raw(col raw);

>>[-9628]:Type(raw) not found.

● create table t_longraw(col long raw);

>>[-9628]:Type(long raw) not found.

● create table t_test(col int);

select rowid from t_test;

>>成功

● create table t_urowid(col urowid);

>>[-9628]:Type(urowid) not found.


总结一下,GBase 8s可全面兼容Oracle常见数据类型,对于少数非常用数据类型,需要进行少量代码改造,或进行相应类型替换。





THE END




——  更多精彩,请戳图片  ——



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存