更新时间:2024-10-10 GMT+08:00

Oracle、Teradata和MySQL语法兼容性差异

GaussDB(DWS)支持Oracle、Teradata和MySQL三种兼容模式,分别兼容Oracle、Teradata和MySQL语法,不同兼容模式下的语法行为有一些差异。

数据库兼容模型可以在创建数据库时指定(由DBCOMPATIBILITY参数控制),语法示例如下,具体参见CREATE DATABASE语法。

1
CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA';
表1 兼容项差异

兼容项

Oracle兼容

Teradata兼容

MySQL兼容

空串

只有null

区分空串和null

区分空串和null

空串转数字

null

转换为0

转换为0

超长字符自动截断

不支持

支持(GUC参数td_compatible_truncation设置为ON)

不支持

null拼接

非null对象与null拼接后返回非null对象。

例如,'abc'||null返回'abc'。

GUC参数behavior_compat_options增加strict_text_concat_td选项后,兼容TD行为,null类型拼接后返回null。

例如,'abc'||null返回null。

兼容MySQL行为,null类型拼接后返回null。

例如,'abc'||null返回null。

char(n)类型拼接

char(n)类型做拼接时移除右侧空格和占位。

例如,cast('a' as char(3))||'b'返回'ab'。

GUC参数behavior_compat_options增加bpchar_text_without_rtrim选项后,char(n)类型做拼接时,保留空格,并补足空格至指定的n长度。

当前不支持“比较字符串时忽略尾部空格”,拼接后结果如果存在尾部空格,进行比较时会对空格敏感。

例如,cast('a' as char(3))||'b'返回'a b'。

移除右侧空格和占位

concat(str1,str2)

返回所有非null字符串的连接

返回所有非null字符串的连接

入参中存在null时,返回结果为null。

left和right负数处理

返回除最后/前|n|个字符以外的所有字符

返回除最后/前|n|个字符以外的所有字符

返回空串

lpad(string text, length int [, fill text])

rpad(string text, length int [, fill text])

通过填充字符fill(缺省为空格),把string填充到length长度,如果string已经比length长则将其尾部截断。如果fill为空串或者length为负数则返回null。

如果fill为空串且string长度小于length时,返回原字符串,如果length为负数则返回空串。

如果fill为空串且string长度小于length时,返回空串,如果length为负数则返回null。

substr(str, s[, n])

s = 0时,返回前n个字符

s = 0时,返回前n个字符。

s = 0时,返回空串。

substring(str, s[, n])

substring(str [from s] [for n])

s = 0时,返回前n - 1个字符

s < 0时,返回前s + n - 1个字符

n < 0时,报错。

s = 0时,返回前n - 1个字符。

s < 0时,返回前s + n - 1个字符。

n < 0时,报错。

s = 0时,返回空串。

s < 0时,倒数第|s|个字符位置开始截取n个字符。

n < 0时,返回空串。

trim、ltrim、rtrim、btrim(string[,characters])

从字符串string的指定位置删除只包含characters中字符(缺省为空格)的最长的字符串。

从字符串string的指定位置删除只包含characters中字符(缺省为空格)的最长的字符串。

从字符串string的指定位置删除等于characters的字符串(缺省为空格)。

log(x)

以10为底的对数

以10为底的对数

自然对数

mod(x, 0)

除数为0时返回x

除数为0时返回x

除数为0时报错

数据类型date

date会转为timestamp,包含年月日时分秒

只有年月

只有年月

to_char(date)

入参最大值仅支持timestamp类型的最大值,不支持date类型的最大值;返回值类型为timestamp

入参最大值仅支持timestamp类型的最大值,不支持date类型的最大值;返回值类型为date,且格式为'YYYY/MM/DD'(GUC参数convert_empty_str_to_null_td打开)。

入参最大值支持timestamp类型的最大值和date类型的最大值;返回值类型为date。

to_date, to_timestamp和to_number空串处理

返回null

返回null(GUC参数convert_empty_str_to_null_td打开)

to_date和to_timestamp返回null,to_number中参数为空串时,返回0。

last_day和next_day返回类型

timestamp类型

timestamp类型

date类型

add_months返回类型

timestamp类型

timestamp类型

入参为date类型,返回date类型。

入参为timestamp类型,返回timestamp类型。

入参为timestamptz类型,返回timestamptz类型。

CURRENT_TIME

CURRENT_TIME(p)

获取当前事务的时间,返回值类型为timetz。

获取当前事务的时间,返回值类型为timetz。

获取当前语句执行时的时间,返回值类型为time。

CURRENT_TIMESTAMP

CURRENT_TIMESTAMP(p)

获取当前语句执行时的时间,返回值类型为timestamptz。

获取当前语句执行时的时间,返回值类型为timestamptz。

获取当前语句执行时的时间,返回值类型为timestamp。

CURDATE

不支持

不支持

获取当前语句执行时的日期,返回值类型为date。

CURTIME(p)

不支持

不支持

获取当前语句执行时的时间,返回值类型为time。

LOCALTIME

LOCALTIME(p)

获取当前事务的时间,返回值类型为time。

获取当前事务的时间,返回值类型为time。

获取当前语句执行时的时间,返回值类型为timestamp。

LOCALTIMESTAMP

LOCALTIMESTAMP(p)

获取当前事务的时间,返回值类型为timestamp。

获取当前事务的时间,返回值类型为timestamp。

获取当前语句执行时的时间,返回值类型为timestamp。

SYSDATE

SYSDATE(p)

获取当前语句执行时的时间,返回值类型为timestamp(0)。

获取当前语句执行时的时间,返回值类型为timestamp(0)。

获取当前系统的时间,返回值类型为timestamp(0)。此函数不可下推,建议用current_date代替。

now()

获取当前事务时间,返回值类型为timestamptz。

获取当前事务时间,返回值类型为timestamptz。

获取语句执行的时间,返回值类型为timestamptz。

操作符'^'

幂运算

幂运算

异或

表达式greatest、least

返回所有非null入参的比较结果

返回所有非null入参的比较结果

入参中存在null时,返回结果为null。

表达式case、coalesce、if、ifnull入参类型不同

报错

兼容TD行为,支持数字和字符串之间的类型转换,比如coalesce参数输入int和varchar类型,解析成varchar类型。

兼容MySQL行为,支持其他类型和字符串之间的类型转换,比如coalesce参数输入date、int和varchar类型,解析成varchar类型。

反引号

不支持

不支持

区分MySQL的保留字与普通字符。