字符串函数
当GaussDB使用的字符编码是SQL_ASCII时,服务器会根据ASCII标准对字节值0~127进行解释,而字节值128~255则当作无法解析的字符。如果该函数的输入输出包含了任何非ASCII数据,数据库将无法帮助用户转换或者校验非ASCII字符,从而与MySQL的行为产生较大差异。
函数名 |
与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() |
|
TRIM() |
- |
UCASE() |
- |
UPPER() |
- |
UNHEX() |
- |
FIELD() |
- |
COMPRESS() |
- |
UNCOMPRESS() |
- |
UNCOMPRESS_LENGTH() |
- |
EXPORT_SET() |
- |
POSITION() |
- |
LOCATE() |
- |
CHAR() |
|
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() |
|
INSERT() |
- |
INSTR() |
- |
OCTET_LENGTH() |
- |