更新时间:2026-10-21 GMT+08:00
分享

系统函数兼容性概述

GaussDB数据库兼容绝大多数MySQL的系统函数,但存在部分差异。

当前存在原GaussDB的系统函数和MySQL系统函数同名,但是M-Compatibility兼容模式下尚未支持这些函数的情况;一部分未支持的同名函数会提示用户在M-Compatibility兼容模式下不支持,另外一部分同名函数仍然保持原GaussDB系统函数的行为。同名函数会与MySQL的行为产生较大差异,因此建议用户尽量避免使用这些同名函数,只使用M-Compatibility兼容模式下的系统函数。

具体同名函数列表如下:

表1 M-Compatibility兼容模式下提示不支持的同名函数

cot

isEmpty

mod

octet_length

overlaps

point

radians

regexp_instr

regexp_like

regexp_replace

regexp_substr

stddev_pop

stddev_samp

var_pop

var_samp

variance

-

-

-

-

表2 M-Compatibility兼容模式下保持原GaussDB系统函数行为的同名函数

ceil

decode

encode

format

instr

position

round

stddev

row_num

-

  • MySQL数据库支持通过可加载函数接口,向MySQL中添加自定义函数,在调用此类函数时,函数的入参支持指定别名。GaussDB不支持可加载函数接口,在调用函数时,函数入参不支持指定别名。
  • M-Compatibility模式下,系统函数存在以下公共差异:
    • 系统函数的返回值类型仅考虑入参node类型为Var(表中数据)和Const(常量输入)类型时的情况与MySQL保持一致,其他情况(如入参为运算表达式、函数表达式等)可能返回值的类型与MySQL有差异。
    • 当聚合函数以其他函数、操作符或SELECT子句等表达式作为入参时(如SELECT sum(abs(n)) FROM t;),聚合函数将获取不到入参表达式传递的精度信息,导致函数的结果精度与MySQL有差异。
    • 系统函数的调用不推荐使用pg_catalog.func_name()形式的调用,当被调用函数存在语法形式的入参时(如SELECT substr('demo' from 1 for 2)),函数的调用可能存在错误。
    • 对于支持多个入参的系统函数,当入参存在NULL时,GaussDB不会对入参进行校验,直接返回NULL;MySQL会对NULL之外的入参进行校验,当存在不合法的入参时,函数返回NULL并产生WARNING。
    • MySQL以带反引号的形式调用系统函数时,不区分大小写。GaussDB以带反引号的形式调用系统函数时,需指定函数名为全小写。
      -- GaussDB
      m_db=# SELECT `abs`(1);
       abs 
      -----
         1
      (1 row)
      
      m_db=# SELECT `Abs`(1);
      ERROR:  Function Abs(integer) does not exist.
      LINE 1: select `Abs`(1);
                     ^
      HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
      CONTEXT:  referenced column: Abs
      
      -- MySQL
      mysql> SELECT `abs`(1);
      +----------+
      | `abs`(1) |
      +----------+
      |        1 |
      +----------+
      1 row in set (0.00 sec)
      
      mysql> SELECT `Abs`(1);
      +----------+
      | `Abs`(1) |
      +----------+
      |        1 |
      +----------+
      1 row in set (0.01 sec)

相关文档