数据类型
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| NUMBER [ ( p [ , s ] ) ] | 支持,有差异 | 精度和用法存在差异。
|
| FLOAT [ ( p ) ] | 支持 | - |
| BINARY_FLOAT | 不支持 | - |
| BINARY_DOUBLE | 支持 | - |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| DATE | 支持,有差异 | GaussDB在未开启mapping_date_to_datea参数时精度有差异,GaussDB支持的公元时间相较于Oracle范围更大;GaussDB在开启mapping_date_to_datea参数时,GaussDB支持的语法、操作符、格式控制与Oracle数据库中DATE类型有差异。 |
| TIMESTAMP [ ( fractional_seconds_precision ) ] | 支持,有差异 | - |
| TIMESTAMP [ ( fractional_seconds_precision ) ] WITH TIME ZONE | 支持,有差异 | GaussDB的timestamptz等价于Oracle的timestampwithlocaltimezone,缺少Oracle对应的timestamptz类型。 时区更新:部分国家或地区经常会更新时区信息, 数据库系统也因此常常需要同步修改时区文件以确保时间内容的正确性。 GaussDB时区类型目前只涉及timestamp with timezone,当新的时区文件生效时,不会对已有的数据进行变更,新数据会随时区文件信息进行同步调整。与Oracle的同类型数据能力存在差异。 |
| TIMESTAMP [ ( fractional_seconds_precision ) ] WITH LOCAL TIME ZONE | 不支持 | - |
| INTERVAL YEAR [ ( year_precision ) ] TO MONTH | 支持 | - |
| INTERVAL DAY [ ( day_precision ) ] TO SECOND [ ( fractional_seconds_precision ) ] | 支持 | - |
- ORA兼容模式下,GaussDB中日历系统和Oracle日历系统存在以下差异,包括:
- Oracle中存在两套日历系统:儒略历和格里历(公历)。公元1582年10月5日前使用儒略历,闰年计算规则是满足年份能被4整除;公元1582年10月5日后使用格里历,闰年计算规则为满足年份能被4整除且不能被100整除,或者能被400整除。GaussDB中只有格里历(公历)日历系统,闰年计算规则为满足年份能被4整除且不能被100整除,或者能被400整除。
- Oracle中公元1582年包含355天,缺少的10天为公元1582年10月5号到公元1582年10月14号,公元1582年10月4号的下一天是公元1582年10月15号;GaussDB中公元1582年包含365天。
- Oracle存在公元0年,即'-0001-01-01 00:00:00'到'0001-01-01 00:00:00'包含731天;GaussDB中不存在公元0年,即'-0001-01-01 00:00:00'到'0001-01-01 00:00:00'包含366天。
- ORA兼容模式下,在未开启mapping_date_to_datea参数时DATE类型被替换为TIMESTAMP(0) WITHOUT TIME ZONE,差异同TIMESTAMP(0) WITHOUT TIME ZONE。当向DATE类型字段插入带小数点的timestamp数值时,如timestamp '2023-01-01 23:59:59.5',GaussDB会四舍五入,插入表中的结果为'2023-01-02 00:00:00',Oracle会截断,插入表中的结果为'2023-01-01 23:59:59'。
- ORA兼容模式下,在开启mapping_date_to_datea参数时DATE类型被替换为DATEA,差异同DATEA。
- 对于TIMESTAMP [ ( fractional_seconds_precision ) ] / TIMESTAMP [ ( fractional_seconds_precision ) ] WITH TIME ZONE与Oracle存在以下差异。
- fractional_seconds_precision:GaussDB支持的精度范围为0~6,Oracle支持的精度范围为0~9。
- GaussDB通过DateStyle设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。具体请参见日期/时间类型中日期输入的说明介绍。Oracle在一般情况下的输入格式校验及输出显示由NLS_TIMESTAMP_FORMAT/NLS_TIMESTAMP_TZ_FORMAT参数进行控制。
- 对于秒的小数部分的显示,GaussDB默认去除末尾的零,Oracle依据格式化参数中的设置(FF/FF1-FF9)进行显示控制。如 '2017-09-01 10:32:19.212000',GaussDB显示为 '2017-09-01 10:32:19.212',Oracle在format参数中含FF时显示为'2017-09-01 10:32:19.212000',在format参数中含FF9时显示为'2017-09-01 10:32:19.212000000'。
- 支持的时间范围存在差异,GaussDB支持的公元时间较Oracle范围更大。
- 对于超过6位精度的字面量会首先按照第7位精度遵循四舍六入五成双的规则做转换,即第7位为5的时候,第6位将取最接近的偶数。6位精度内的舍入规则以时间2000-01-01 00:00:00为基线,基线前时间五舍六入,基线后时间四舍五入,其中TIMESTAMP WITH TIME ZONE类型的时间基线按照UTC-0时区计算。
- ORA兼容模式下,在开启mapping_date_to_datea参数时DATE与Oracle的DATE类型存在以下差异。
- 支持字面量定义DATEA类型,如“SELECT datea '2024-10-01' ;”,与Oracle存在差异,GaussDB中的字面量字符串受nls_date_format校验,若不符合nls_date_format值则会报错或输出错误数据,而Oracle中字面量格式校验则受到固定格式YYYY-MM-DD的校验。
- 在使用CREATE TABLE、CREATE VIEW、PREPARE创建对象时,GaussDB与Oracle存在差异。 GaussDB中,如果存在未明确类型(UNKNOWN)时,会对UNKNOWN类型向明确类型进行一次转换,如果转换失败,则创建对象报错,如果转换成功则会将该值保存为确定类型值,并且之后的操作不再受额外参数的影响。例如,有如下的典型场景:
WHERE datea_column > 'unknown_text' 'unknown_text'::datea cast('unknown_text' as datea) datea'unknown text'而如果原始定义中存在函数等其他表达式时,则使用宽松校验。定义对象时,只要该表达式返回值类型能够转换成目标类型,则可以创建成功,不需要在定义时执行该表达式。例如:
CREATE TABLE t (a DATE DEFAULT to_date('2024-10-01'));上述语句在创建表时不会受nls_date_format格式校验。
- 当UNKNOWN、CHAR、CHARACTER、NCHAR、BPCHAR、VARCHAR、CHARACTER VARYING、VARCHAR2、NVARCHAR2、TEXT、CLOB类型格式符合数值格式,GaussDB支持DATEA加以上类型(左右操作数可交换)和DATEA减以上类型,不支持以上类型减DATEA类型;当CHAR、CHARACTER、NCHAR、VARCHAR、CHARACTER VARYING、VARCHAR2、NVARCHAR2类型格式符合数值格式,Oracle支持DATE类型加以上类型(左右操作数可交换)和DATE类型减以上类型,不支持以上类型减DATE类型。
- 当UNKNOWN、CHAR、CHARACTER、NCHAR、BPCHAR、VARCHAR、CHARACTER VARYING、VARCHAR2、NVARCHAR2、TEXT、CLOB类型格式符合时间格式,GaussDB支持以上类型减DATEA类型,不支持DATEA加以上类型(左右操作数可交换)和DATEA减以上类型;当CHAR、CHARACTER、NCHAR、VARCHAR、CHARACTER VARYING、VARCHAR2、NVARCHAR2类型格式符合时间格式,Oracle不支持DATE类型加以上类型(左右操作数可交换),不支持DATE类型减以上类型和以上类型减DATE类型。
- GaussDB中DATEA类型格式控制只支持nls_date_format参数,Oracle中除了nls_date_format参数还支持nls_date_language参数。
- GaussDB中DATEA类型和CLOB类型之间支持互相隐式转换;Oracle在某些场景下不支持。
- Oracle数据库在日期时间类型与数值类型之间进行算术运算(+、-)时,会将日期时间类型操作数隐式转换为DATE类型,运算结果也为DATE类型。GaussDB遵循自身的类型提升规则,运算结果类型与左操作数类型保持一致,不进行向DATEA类型的隐式降级转换。
- GaussDB中支持DATEA类型和INTERVAL类型、数值类型、RAW等类型之间的比较操作,Oracle不支持,具体请参见比较操作符。
- GaussDB中支持的nls_date_format元素与Oracle存在一些行为差异,包括:
- GaussDB不支持E/EE,Oracle支持。
- DL/DS/TS在GaussDB中不能用于to_date,Oracle支持用于to_date。
- 不支持输入的字符串带后置空格,如nls_date_format = 'yyyy-mm-dd'; 在将下面字符串转为date类型时会报错:“SELECT date '2024 -10-01' FROM dual;”, Oracle支持该写法。
- 在Oracle中对于"text"分隔符,需要校验输入,但是在当前GaussDB中,只影响输出,不影响输入。
- FX和FM与Oracle行为存在差异,GaussDB中的FM功能和Oracle一样,都用来转为字符串时抑制前导0和后置空格,但GaussDB中其只能作为前缀,且作用范围只是在每一个基础元素上,与Oracle中的作用范围有差异;FX功能与Oracle中一致,都是用于精确校验是否符合nls格式,但GaussDB中FX作用范围为只要FX出现1次,后面的所有元素都需要精确校验,直到遇到FM为止,与Oracle中的作用范围有差异。
- GaussDB支持TH作为后缀;Oracle实际不起作用。
- GaussDB不支持THSP、SPTH作为后缀,SP可以设置为后缀,但实际不起作用。
- GaussDB中前缀、后缀不允许在一个格式化模型元素中连续多次出现,如FMFMYYYY、YYYYTHTH。
- GaussDB中的DATEA类型仅支持btree/ubtree/psort/cbtree索引,不支持gin/ugin/gist索引。
- GaussDB中的DATEA类型仅支持JDBC、ODBC、libpq驱动,不支持GO、Python驱动。
- GaussDB中的DATEA类型不支持作为范围类型使用。
- GaussDB中的DATEA类型的算术操作符(包括DATEA相减、DATEA与数值类型的加减运算等)内部使用float8(双精度浮点数)进行中间计算,再转换为结果类型输出。由于float8的有效精度约为15位十进制数字,当运算结果的小数部分位数较多时,可能出现末尾精度损失。例如DATEA相减返回numeric类型时,有效位数最多约15位;DATEA与数值加减返回DATEA类型时,结果中的时分秒部分可能出现微秒级精度偏差。Oracle中DATE类型的算术运算返回NUMBER类型,不存在此精度限制。如需高精度日期计算,建议使用EXTRACT等函数分别提取时间元素后计算。
- GaussDB的gsql端不按照nls_date_format格式显示DATEA数据,而是按照固定格式'YYYY-MM-DD HH24:MI:SS AD/BC'显示。Oracle的sqlplus端按照nls_date_format格式显示DATE数据。
- ORA兼容模式下,支持AT TIME ZONE语法,但是语义与Oracle不一致。在GaussDB中,AT TIME ZONE是类型转换操作符。timestamp AT TIME ZONE zone将不带时区的timestamp按照指定时区解释为UTC时间点,返回timestamptz类型(显示时转换为当前会话时区);timestamptz AT TIME ZONE zone将带时区的时间戳转换为指定时区的本地时间,返回timestamp类型。但在Oracle中,AT TIME ZONE是时间语义重解释操作符,保持返回类型不变(TIMESTAMP WITH TIME ZONE输入仍返回TIMESTAMP WITH TIME ZONE),仅将时间值按目标时区重新呈现。
- ORA兼容模式下,在使用CREATE TABLE创建对象时,GaussDB与Oracle存在差异:
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| VARCHAR2 [ ( size [ BYTE | CHAR ] ) ] | 支持,有差异 | 在GaussDB中,size的单位为字节,最大值为10M。 在Oracle中,当MAX_STRING_SIZE=EXTENDED时,最大长度为32767字节;当MAX_STRING_SIZE=STANDARD时,最大长度为4000字节。 |
| NVARCHAR2 ( size ) | 支持,有差异 | 在GaussDB中,size的单位为字节,最大值为10M,实际能容纳的字符数与使用的字符集有关;在Oracle中,当MAX_STRING_SIZE=EXTENDED时,最大长度为32767字节,当MAX_STRING_SIZE=STANDARD时,最大长度为4000字节,实际能容纳的字符数与使用的字符集有关。 在GaussDB中,NVARCHAR2结尾的空格在插入时会被忽略;在Oracle中,NVARCHAR2结尾的空格在插入时不会被忽略。 |
| CHAR [ ( size [ BYTE | CHAR ] ) ] | 支持,有差异 | 在GaussDB中,size的单位为字节,最大值为10M;在Oracle中,最大长度为2000字节。 |
| NCHAR [ ( size ) ] | 支持,有差异 | 在GaussDB中,size单位为字节,最大10MB,实际能容纳的字符数与使用的字符集有关;而在Oracle中,NCHAR是用于存储固定长度Unicode字符的数据类型,size单位为字符,最大容量为2000个字节。 |
| CLOB | 支持,有差异 | 不支持定位器。 |
| NCLOB | 不支持 | - |
| LONG | 不支持 | - |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| RAW ( size ) | 支持,有差异 | 在GaussDB中,size是指字节长度建议值,不会用于校验输入raw类型的字节长度。 |
| LONG RAW | 不支持 | - |
| BLOB | 支持 | - |
| BFILE | 不支持 | - |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| ROWID | 支持,有差异 | 在GaussDB中,ROWID类型是按照node_slice、table_oid、bucket_id、row_no字段数值依次比较;在Oracle中,ROWID类型是按照data object number、relate file number、block number、row number字段数值依次比较。ROWID类型操作符比较规则参见操作符。 |
| UROWID | 不支持 | - |
| Oracle数据库 | GaussDB数据库 |
|---|---|
| 对象类型 | 不支持 |
| REF数据类型 | 不支持 |
| 可变数组 | 支持 |
| 嵌套表 | 支持 |
| Oracle数据库 | GaussDB数据库 |
|---|---|
| anytype | 不支持 |
| anydata | 不支持 |
| anydataset | 不支持 |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| XMLTYPE | 支持,有差异 | GaussDB中不支持部分操作,如不能通过使用XMLELEMENT函数将字符串转变为XMLTYPE类型,而是转变成XML类型。具体请参见XMLTYPE类型。 |
| URITYPE | 不支持 | - |
| Oracle数据库 | GaussDB数据库 |
|---|---|
| SDO_GEOMETRY | 不支持 |
| SDO_TOPO_GEOMETRY | 不支持 |
| SDO_GEORASTER | 不支持 |
| Oracle数据库 | GaussDB数据库 |
|---|---|
| none | - |
| null | AccessShare |
| RS | RowShare |
| RX | RowExclusive |
| S | ShareUpdateExclusive |
| SRX | Share |
| - | ShareRowExclusive |
| X | Exclusive |
| - | AccessExclusive |
| - | INVALID 说明: GaussDB的INVALID表示被赋予了非法锁。仅在运行过程中出现了GaussDB无法识别的锁时会被赋予INVALID锁。 |