openGauss和Oracle基础数据类型兼容性详细说明
简介
本文详细介绍openGauss V5.0数据库与Oracle 23C数据库下,基础数据类型的兼容性对比信息。基础数据类型是以Oracle官网文档中Oracle Built-in Data Types章节的内容为基础,并整合从openGauss官网文档中搜集的数据类型描述信息进行比对,将通过对比语法来综合来判断,是否做到兼容Oracle的数据类型。对于兼容性只是通过个人工作经对于数据类型是否使用即使用频率主观判断来综合判断,满足日常应用开发需求即为满足,其实对于异构数据库的数据类型功能也做不到完全一致。
基础数据类型
Oracle数据类型 | Oracle类型描述 | openGauss类型描述 | 语法 | 是否兼容 |
---|---|---|---|---|
VARCHAR2(size [BYTE | CHAR]) | Oracle默认最大长度为4000字符或字节;当MAX_STRING_SIZE =EXTENDED时,最大长度为 32767字节或字符 | 1、openGauss不支持定义字符长度 2、openGauss size单位为字节,最大10MB; 3、当字段定义长度为字符时,从Oracle迁移到openGauss,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
支持定义字节长度;不支持定义字符长度 | 是 |
NVARCHAR2(size) | Oracle默认最大长度为4000字符或字节;当MAX_STRING_SIZE =EXTENDED时,最大长度为 32767字节或字符 | 1、openGauss不支持定义字符长度 2、openGauss size单位为字节,最大10MB; 3、在从Oracle迁移到openGauss,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
支持 | 是 |
NUMBER [ (p [, s]) ] | 1、oracle 标度s允许小于0,这时可以存储为科学计数法; 2、oracle的精度p最大为38位; |
1、openGauss的标度s取值范围[0,p] 2、openGauss的精度位数为1000精度p取值范围为[1,1000] |
支持 | 是 |
FLOAT [(p)] | 在Oracle中FLOAT [ ( p ) ]是具有精度p的NUMBER数据类型的子类型。FLOAT值在内部表示为NUMBER。精度p的取值范围是1到126位二进制数字。FLOAT值需要1 ~ 22个字节。 | 根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示,存储空间同样需要4字节或8字节。如不指定精度,内部用DOUBLE PRECISION表示,精度p取值范围为[1,53]。 | 支持 | 是 |
LONG | 可变长度的字符数据,最大可达2GB | 可以用TEXR字段类型替换,字段存储最大不超过1G | 不支持 | 是 |
DATE | 1、Oracle的DATE类型包括日期和时间值; | 4字节(兼容模式A下存储空间大小为8字节),默认情况只包含日期 | 支持 | 是 |
BINARY_FLOAT | Oracle是32位单精度浮点数数据类型,范围为1.17549E-38F~3.40282E+38F; | openGauss也是32位双精度浮点数数据类型,范围为-3.402E+38~3.402E+38,6位十进制数字精度 可用FLOAT4替换 |
不支持 | 是 |
BINARY_DOUBLE | Oracle的BINARY_DOUBLE是64位双精度浮点数数据类型,范围为2.22507485850720E-308~1.79769313486231E+308; | openGauss也是64位双精度浮点数数据类型,范围为-1.79E+308~1.79E+308,15位十进制数字精度 | 支持 | 是 |
TIMESTAMP [(fractional_seconds_precision)] | Oracle的fractional_seconds_precision是second datetime字段小数部分的位数,fractional_seconds_precision取值范围为0 ~ 9。默认值是6。 | openGauss的fractional_seconds_precision,取值范围为0~6 | 支持 | 是 |
TIMESTAMP [(fractional_seconds_precision )] WITH TIME ZONE |
TIMESTAMP的所有值以及时区位移值,其中fractional_seconds_precision是SECOND datetime字段小数部分的位数。 取值范围为0 ~ 9。默认值是6。 |
日期和时间,带时区。TIMESTAMP的别名为TIMESTAMPTZ。p表示小数点后的精度,取值范围为0~6。openGauss的该字段类型功能等价于TIMESTAMP WITH LOCAL TIME ZONE | 支持 | 是 |
TIMESTAMP [(fractional_seconds_precision )] WITH LOCAL TIME ZONE |
TIMESTAMP WITH TIME ZONE的所有值,但有以下例外: 数据存储在数据库中时,会被归一化为数据库时区。 当数据被检索时,用户看到会话时区的数据。方法显式确定默认格式参数NLS_TIMESTAMP_FORMAT或由 NLS_TERRITORY参数。大小为7或11字节,具体取决于精度。 |
不支持 | 否 | |
INTERVAL YEAR [(year_precision)] TO MONTH |
Oracle中以年和月为单位存储一段时间,其中year_precision是YEAR datetime字段中的位数。取值范围为0 ~ 9。默认值是2。 | openGauss INTERVAL [FIELDS] [ § ]中的fields:可以是YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,DAY TO HOUR,DAY TO MINUTE,DAY TO SECOND,HOUR TO MINUTE,HOUR TO SECOND,MINUTE TO SECOND | 支持 | 是 |
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision )] |
Oracle中以天、小时、分和秒为单位存储一段时间,其中day_precision是DAY datetime字段的最大位数。取值范围为0 ~ 9。默认值是2。fractional_seconds_precision是SECOND字段小数部分的位数。取值范围为0 ~ 9,默认值是6 | openGauss中时间间隔,X天X小时X分X秒。day_precision:天数的精度,取值范围为06。兼容性考虑,目前未实现具体功能。fractional_seconds_precision:秒数的精度,取值范围为06。小数末尾的零不显示 | 支持 | 是 |
RAW(size) | oracle的MAX_STRING_SIZE = STANDARD,最大为为2000字节;MAX_STRING_SIZE = EXTENDED,最大为32767字节。 | 最大为1073733621字节 | 支持 | 是 |
LONG RAW | 最长可达2GB的可变长度的原始二进制数据 | 不支持 | 否 | |
ROWID | 表示表中一行的唯一地址的Base 64字符串。这种数据类型主要用于ROWID伪列返回的值 | 不支持 | 否 | |
UROWID [(size)] | 表示索引组织表的一行的逻辑地址的Base 64字符串。最大大小和默认值是4000字节 | 不支持 | 否 | |
CHAR [(size [BYTE | CHAR])] | 1、Oracle最大长度为2000字符或字节 2、当字段定义长度为字符时,从Oracle迁移到openGauss,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
1、不支持定义字符长度 2、openGauss size单位为字节,最大10MB; |
支持定义字节长度;不支持定义字符长度 | 是 |
NCHAR[(size)] | 1、Oracle最大长度为2000字符; 2、在从Oracle迁移到openGauss,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
1、openGauss不支持定义字符长度 2、openGauss size单位为字节,最大10MB; |
支持 | 是 |
CLOB | 2、Oracle字段存储最大上限4g(如果修改数据块的大小,可存储上限会增大) | openGauss最大支持1g | 支持 | 是 |
NCLOB | 最大大小为(4gb - 1) *(数据库块大小)。存储国家字符集数据 | 不支持 | 否 | |
BLOB | 二进制大对象。最大大小为(4GB - 1) *(数据库块大小) | 最大为1GB-8203字节(即1073733621字节)。 | 支持 | 是 |
BFILE | 包含存储在数据库外部的大型二进制文件的定位器。允许字节流I/O访问驻留在数据库服务器上的外部lob。最大大小为4GB | 不支持 | 否 | |
JSON | 最大大小为32MB | openGauss内存在两种数据类型JSON和JSONB,可以用来存储JSON数据。其中JSON是对输入的字符串的完整拷贝,使用时再去解析,所以它会保留输入的空格、重复键以及顺序等;JSONB解析输入后保存的二进制,它在解析时会删除语义无关的细节和重复的键,对键值也会进行排序,使用时不用再次解析 | 支持 | 是 |
BOOLEAN | BOOLEAN数据类型对应的值包含True和False | true:真false:假null:未知(unknown) | 支持 | 是 |
总结
总之,openGauss数据库A兼容模式下,对基础数据类型兼容性较高,虽然在数据类型兼容方面仍然存在如下的问题:1、数据类型LONG、BINARY_FLOAT即使语法不兼容,但是在openGauss中也可以其他的类型替换;2、openGauss不支持定义字符长度,也可以通过对openGauss迁移后的字段长度扩容间接进行支持;3、ROWID、NCLOB等类型字段类型不支持,但是在实际应用开发中使用率也比较低,对整体项目的迁移影响还是有限。