# 系统函数兼容性概述
GaussDB数据库兼容绝大多数MySQL的系统函数，但存在部分差异。
当前存在原GaussDB的系统函数和MySQL系统函数同名，但是M-Compatibility兼容模式下尚未支持这些函数的情况；一部分未支持的同名函数会提示用户在M-Compatibility兼容模式下不支持，另外一部分同名函数仍然保持原GaussDB系统函数的行为。同名函数会与MySQL的行为产生较大差异，因此建议用户尽量避免使用这些同名函数，只使用M-Compatibility兼容模式下的系统函数。
具体同名函数列表如下：
表1M-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       | -             | -            | -            | -             |
   
表2M-Compatibility兼容模式下保持原GaussDB系统函数行为的同名函数 
|  ceil   | decode  | encode  | format | instr |
|---|---|---|---|---|
| position | round | stddev | row_num | -   |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 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)
    ```
    
   
 
