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。 作为非XMLTYPE操作函数的系统函数的入参。 作为分布键、分区键、二级分区键、外键、主键、唯一约束。 XMLTYPE相关的隐式类型转换,包括字符串和XMLTYPE类型之间的隐式转换。 数组表达式、行表达式、子查询表达式、TABLE OF和TABLE OF INDEX。 使用XMLTYPE数据格式列做为普通索引、unique索引、global索引、local索引、部分索引。 比较表达式>、<、>=、<=、=、<>、!=、^=、between and、is distinct from、is not distinct from、<=>。 条件表达式decode、nullif、greatest、least。 作为distinct/group by/order by 参数。 聚合函数sum、max、min、avg、list_agg、corr、covar_pop、cover_samp、stddev、stddev_pop、stddev_samp、var_pop、var_samp、variance、bit_and、bit_or、bool_and、bool_or、every、regr_avgx、regr_avgy、regr_count、regr_intercept、regr_r2、regr_slope、regr_sxx、regr_sxy、regr_syy、rank、spread。 不支持ODBC相关绑定传参接口。 |
| URIType | 不支持 | - | - |
空间类型
| Oracle数据类型 | GaussDB是否支持语法 | 差异(GaussDB) |
|---|---|---|
| SDO_GEOMETRY | 不支持 | - |
| SDO_TOPO_GEOMETRY | 不支持 | - |
| SDO_GEORASTER | 不支持 | - |
总结
总之,GaussDB数据库Oracle兼容模式下,能够做到支持绝大部应用开发使用,虽然在数据类型兼容方面仍然存在个别功能差异,但是对当下Oracle到GaussDB整体项目的迁移影响还是有限。另外本文的所有内容参考gaussdb的官网文档整理。
– / END / –
可以通过下面的方式联系我
如果这篇文章为你带来了灵感或启发,就请帮忙点赞、收藏、转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!
最后修改时间:2025-02-06 10:48:59
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




