更新时间:2025-06-30 GMT+08:00

字符串函数

当GaussDB使用的字符编码是SQL_ASCII时,服务器会根据ASCII标准对字节值0~127进行解释,而字节值128~255则当作无法解析的字符。如果该函数的输入输出包含了任何非ASCII数据,数据库将无法帮助用户转换或者校验非ASCII字符,从而与MySQL的行为产生较大差异。

表1 字符串函数列表

函数名

与MySQL的差异

ASCII()

-

BIT_LENGTH()

-

CHAR_LENGTH()

如果数据库字符集是SQL_ASCII,该函数会返回字节数而非字符数。

CHARACTER_LENGTH()

CONCAT()

-

CONCAT_WS()

-

HEX()

-

LENGTH()

-

LPAD()

MySQL默认最大填充长度为1398101,GaussDB默认最大长度为1048576。在不同字符集下,最大填充长度会有差异,例如字符集为GBK时,GaussDB默认最大长度为2097152。

RPAD()

MD5()

当BINARY类型插入字符串长度小于目标长度时,GaussDB填充符和MySQL不同;因此导致入参为BINARY类型时,函数结果和MySQL不一致。

RANDOM_BYTES()

GaussDB与MySQL都使用OPENSSL生成随机字符串。GaussDB使用OPENSSL3.x.x生成随机字符串,与使用OPENSSL1.x.x版本的MySQL相比性能可能存在劣化。

REPEAT()

-

REPLACE()

当第三个入参为null,且第二个入参的字符串长度不为0时,GaussDB返回NULL,MySQL可能返回第一个参数的字符。例如:

-- GaussDB的行为:
m_db=# select replace('1.23', binary(1.1), null);
 replace 
---------

(1 row)

-- MySQL的行为:
mysql> select replace('1.23', binary(1.1), null);
+------------------------------------+
| replace('1.23', binary(1.1), null) |
+------------------------------------+
| 1.23                               |
+------------------------------------+
1 row in set (0.00 sec)

SHA()/SHA1()

-

SHA2()

-

SPACE()

-

STRCMP()

-

FIND_IN_SET()

-

LCASE()

-

LEFT()

-

LOWER()

-

LTRIM()

-

REVERSE()

-

RIGHT()

-

RTRIM()

-

SUBSTR()

第一个入参节点返回的字符序为BINARY时,MySQL可能依旧以不同的字符序逻辑处理(取决于内层嵌套的函数),而GaussDB以BINARY字符序进行函数处理,导致截取的字节长度不同。

SUBSTRING()

SUBSTRING_INDEX()

  • 在第三个入参为负数时,MySQL与GaussDB的比较逻辑不同,会导致结果可能存在差异。
  • 当第三个入参为正数时,由于MySQL 5.7以int32位存储,会存在回绕问题导致结果不正确。MySQL 8.0修复了该问题以int64为存储,GaussDB以8.0为准。当入参值超过2^63 -1时,也会发生回绕,可能导致第三个参数获取为负数,结果存在差异。

TRIM()

-

UCASE()

-

UPPER()

-

UNHEX()

-

FIELD()

-

COMPRESS()

-

UNCOMPRESS()

-

UNCOMPRESS_LENGTH()

-

EXPORT_SET()

-

POSITION()

-

LOCATE()

-

CHAR()

  • CHAR函数指定字符集时,若转码失败,GaussDB产生报错,MySQL提示WARNING并返回NULL。
  • MySQL在参数为ASCII表中第0~31个和127个码值时,返回结果不可见,GaussDB会以\x01、\x02等16进制返回。
  • MySQL中CHAR函数入参个数无限制,GaussDB函数的入参不超过8192个。

ELT()

MySQL中ELT函数入参个数无限制,GaussDB函数的入参不超过8192个。

FORMAT()

-

BIN()

-

MAKE_SET()

MySQL 5.7版本,当MAKE_SET函数选中的第一个参数为整型、浮点型或定点型且返回结果中存在非ASCII字符,显示结果可能为乱码;GaussDB显示结果正常,和MySQL 8.0版本保持一致。

TO_BASE64()

-

FROM_BASE64()

-

ORD()

-

MID()

-

QUOTE()

  • 当入参字符串中含“\0”时,GaussDB中由于字符集不支持导致无法输入。由转义字符导致的本函数与MySQL的差异,与本函数无关。
  • GaussDB最大支持1GB数据传输,str入参长度最大支持536870908字节,函数返回结果字符串最大支持1GB。
  • 入参为固定长度BINARY类型时,对于未填充字符:MySQL默认补充空字符“\0”,GaussDB默认补充空格。

INSERT()

-

INSTR()

-

OCTET_LENGTH()

-