Oracle、Teradata和MySQL语法兼容性差异
GaussDB(DWS)支持Oracle、Teradata和MySQL三种兼容模式,分别兼容Oracle、Teradata和MySQL语法,不同兼容模式下的语法行为有一些差异。
数据库兼容模型可以在创建数据库时指定(由DBCOMPATIBILITY参数控制),语法示例如下,具体参见CREATE DATABASE语法。
1
|
CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA'; |
兼容项 |
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的保留字与普通字符。 |