Oracle、Teradata和MySQL语法兼容性差异
GaussDB(DWS)支持Oracle、Teradata和MySQL三种兼容模式,分别兼容Oracle、Teradata和MySQL语法,不同兼容模式下的语法行为有一些差异。
兼容项 |
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。 |
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 |
LOCALTIME LOCALTIME(p) |
获取当前事务的时间,返回值类型为time |
获取当前事务的时间,返回值类型为time |
获取当前语句执行时的时间,返回值类型为time |
LOCALTIMESTAMP LOCALTIMESTAMP(p) |
获取当前事务的时间,返回值类型为timestamp |
获取当前事务的时间,返回值类型为timestamp |
获取当前语句执行时的时间,返回值类型为timestamp |
SYSDATE SYSDATE(p) |
获取当前语句执行时的时间,返回值类型为timestamp(0) |
获取当前语句执行时的时间,返回值类型为timestamp(0) |
获取当前系统的时间,返回值类型为timestamp(0) |
NOW() |
获取当前事务时间,返回值类型为timestamptz |
获取当前事务时间,返回值类型为timestamptz |
获取语句执行的时间,返回值类型为timestamptz |
操作符'^' |
幂运算 |
幂运算 |
异或 |
表达式case、coalesce、if、ifnull入参类型不同 |
报错 |
兼容TD行为,支持数字和字符串之间的类型转换,比如coalesce参数输入int和varchar类型,解析成varchar类型。 |
兼容MySQL行为,支持其他类型和字符串之间的类型转换,比如coalesce参数输入date、int和varchar类型,解析成varchar类型。 |