gaussdb和Oracle数据类型兼容性说明
简介
本文详细介绍GaussDB数据库Oracle兼容模式与Oracle数据库19C版本下,数据类型的兼容性对比信息。下面将通过对Oracle和GaussDB数据类型的语法、功能进行比较。本次对于功能是否支持的判断,只是主观的通过个人工作经验判断,满足日常应用开发需求即为满足,其实对于异构数据库的数据类型功能也做不到完全一致。
数值类型
| Oracle数据类型 | GaussDB语法是否支持 | GaussDB功能是否支持 | 差异说明 |
|---|---|---|---|
| NUMBER [ ( p [ , s ] ) ] | 支持 | 满足 | 1、oracle 标度s允许小于0,这时可以存储为科学计数法;GaussDB的标度s取值范围[0,p] 2、oracle的精度p最大为38位;GaussDB的精度位数为1000精度p取值范围为[1,1000] |
| FLOAT [ ( p ) ] | 支持 | 满足 | 1、在Oracle中FLOAT [ ( p ) ]是具有精度p的NUMBER数据类型的子类型。FLOAT值在内部表示为NUMBER。精度p的取值范围是1到126位二进制数字。FLOAT值需要1 ~ 22个字节。 GaussDB中根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示,存储空间同样需要4字节或8字节。如不指定精度,内部用DOUBLE PRECISION表示,精度p取值范围为[1,53]。 |
| LONG | 不支持 | 部分满足 | 建议可以用TEXR字段类型替换,字段存储最大不超过1G |
| BINARY_FLOAT | 不支持 | 满足 | 1、Oracle是32位单精度浮点数数据类型,范围为1.17549E-38F3.40282E+38F;GaussDB也是32位双精度浮点数数据类型,范围为-3.402E+383.402E+38,6位十进制数字精度 2、 GaussDB中可用REAL,FLOAT4替换 |
| BINARY_DOUBLE | 支持 | 满足 | 1、Oracle的BINARY_DOUBLE是64位双精度浮点数数据类型,范围为2.22507485850720E-3081.79769313486231E+308;GaussDB也是64位双精度浮点数数据类型,范围为-1.79E+3081.79E+308,15位十进制数字精度 |
日期时间类型
| Oracle数据类型 | GaussDB是否支持语法 | GaussDB功能是否满足 | 差异(GaussDB) |
|---|---|---|---|
| DATE | 支持 | 满足 | 1、Oracle的DATE类型包括日期和时间值;GaussDB默认是只包含日期 2、当在创建数据库的时把数据库兼容模式设置为Oracle,则功能一致;否则精度有差异,GaussDB不保存时间值 |
| TIMESTAMP[ ( fractional_seconds_precision ) ] | 支持 | 满足 | 1、Oracle的fractional_seconds_precision是second datetime字段小数部分的位数,fractional_seconds_precision取值范围为0 ~ 9。默认值是6。GaussDB的fractional_seconds_precision,取值范围为0~6 2、两者虽然存在差异,但是相差不大,可以理解为一致 |
| TIMESTAMP[ ( fractional_seconds_precision ) ] WITH TIME ZONE | 支持 | 不满足 | GaussDB的timestamptz等价于Oracle的timestamp with loacl timezone的功能,缺少Oracle对应的timestamptz类型对应功能 |
| TIMESTAMP[ ( fractional_seconds_precision ) ] WITH LOCAL TIME ZONE | 不支持 | 满足 | GaussDB的timestamptz等价于Oracle的timestamp with loacl timezone的功能,但是不支持timestamp with loacl timezone语法创建,需要通过timestamp with timezone来创建 |
| INTERVAL YEAR[ ( year_precision ) ] TO MONTH | 支持 | 满足 | 1、Oracle中以年和月为单位存储一段时间,其中year_precision是YEAR datetime字段中的位数。取值范围为0 ~ 9。默认值是2。 2、GaussDB 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 ) ] | 支持 | 满足 | 1、Oracle中以天、小时、分和秒为单位存储一段时间,其中day_precision是DAY datetime字段的最大位数。取值范围为0 ~ 9。默认值是2。fractional_seconds_precision是SECOND字段小数部分的位数。取值范围为0 ~ 9,默认值是6 2、GaussDB中时间间隔,X天X小时X分X秒。day_precision:天数的精度,取值范围为06。兼容性考虑,目前未实现具体功能。fractional_seconds_precision:秒数的精度,取值范围为06。小数末尾的零不显示 |
字符类型
| Oracle数据类型 | GaussDB是否支持语法 | GaussDB功能是否满足 | 差异(GaussDB) |
|---|---|---|---|
| VARCHAR2 ( size [ BYTE |CHAR ] ) | 支持定义字节长度;不支持定义字符长度 | 部分满足 | 1、GaussDB不支持定义字符长度 2、GaussDB size单位为字节,最大10MB;Oracle默认最大长度为4000字符或字节;当MAX_STRING_SIZE =EXTENDED时,最大长度为 32767字节或字符 3、当字段定义长度为字符时,从Oracle迁移到GaussDB,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
| NVARCHAR2 ( size ) | 支持 | 部分满足 | 1、GaussDB不支持定义字符长度 2、GaussDB size单位为字节,最大10MB;Oracle默认长度为4000字符或字节;当MAX_STRING_SIZE =EXTENDED时,最大长度为 32767字节或字符 3、在从Oracle迁移到GaussDB,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
| CHAR [ ( size [ BYTE |CHAR ] ) ] | 支持定义字节长度;不支持定义字符长度 | 部分满足 | 1、GaussDB不支持定义字符长度 2、GaussDB size单位为字节,最大10MB;Oracle最大长度为2000字符或字节 3、当字段定义长度为字符时,从Oracle迁移到GaussDB,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
| NCHAR [ ( size ) ] | 支持 | 部分满足 | 1、GaussDB不支持定义字符长度 2、GaussDB size单位为字节,最大10MB;Oracle最大长度为2000字符或字节; 3、在从Oracle迁移到GaussDB,需要考虑对该字段字符到字节长度的转换,具体需要考虑Oracle源数据库的字符集 |
| CLOB | 支持 | 部分满足 | 1、GaussDB不支持定位器概念 2、Oracle字段存储最大上限4g(如果修改数据块的大小,可存储上限会增大),GaussDB最大支持1g |
| NCLOB | 不支持 | – | – |
二进制类型
| Oracle数据类型 | GaussDB是否支持语法 | GaussDB功能是否满足 | 差异(GaussDB) |
|---|---|---|---|
| RAW ( size ) | 支持 | 满足 | oracle的MAX_STRING_SIZE = STANDARD,最大为为2000字节;MAX_STRING_SIZE = EXTENDED,最大为32767字节。GaussDB最大为1073733621字节 |
| LONG RAW | 不支持 | – | – |
| BLOB | 支持 | 部分满足 | 1、GaussDB不支持定位器概念 2、Oracle字段存储最大上限4g(如果修改数据块的大小,可存储上限会增大),GaussDB最大支持1g |
| BFILE | 不支持 | – | – |
ROWID类型
| Oracle数据类型 | GaussDB是否支持语法 | 差异(GaussDB) |
|---|---|---|
| ROWID | 不支持 | – |
| UROWID | 不支持 | – |
用户自定义类型
| Oracle数据类型 | GaussDB是否支持语法 | GaussDB功能是否满足 | 差异(GaussDB) |
|---|---|---|---|
| 对象类型 | 不支持 | 部分满足 | 只验证了基础建表设置该类型,其他功能未验证,当前只标记为部分满足 |
| REF数据类型 | 不支持 | – | – |
| Varrays | 不支持 | – | Varrays不支持,但是在PLSQL中支持该类型 |
| 嵌套表 | 支持 | 部分满足 | 只验证了基础建表设置该类型,其他功能未验证,当前只标记为部分满足 |
伪类型
| Oracle数据类型 | GaussDB是否支持语法 | 差异(GaussDB) |
|---|---|---|
| anytype | 不支持 | – |
| anydata | 不支持 | – |
| anydataset | 不支持 | – |
xml类型
| Oracle数据类型 | GaussDB是否支持语法 | GaussDB功能是否满足 | 差异(GaussDB) |
|---|---|---|---|
| XMLType | 支持 | 部分满足 | GaussDB不支持操作如下:
逻辑表达式and、or、not。 |
| URIType | 不支持 | – | – |
空间类型
| Oracle数据类型 | GaussDB是否支持语法 | 差异(GaussDB) |
|---|---|---|
| SDO_GEOMETRY | 不支持 | – |
| SDO_TOPO_GEOMETRY | 不支持 | – |
| SDO_GEORASTER | 不支持 | – |
总结
总之,GaussDB数据库Oracle兼容模式下,能够做到支持绝大部应用开发使用,虽然在数据类型兼容方面仍然存在个别功能差异,但是对当下Oracle到GaussDB整体项目的迁移影响还是有限。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/317075.html