字符串函数
TiDB 支持使用大部分 MySQL 5.7 中提供的字符串函数、一部分 MySQL 8.0 中提供的字符串函数和一部分 Oracle 21 所提供的函数。
关于 Oracle 函数和 TiDB 函数的对照关系,请参考 Oracle 与 TiDB 函数和语法差异对照。
支持的函数
| 函数名 | 功能描述 | 
|---|---|
ASCII() | 返回最左字符的数值 | 
BIN() | 返回一个数的二进制值的字符串表示 | 
BIT_LENGTH() | 返回字符串的位长度 | 
CHAR()     | 返回由整数的代码值所给出的字符组成的字符串 | 
CHAR_LENGTH() | 返回字符串的字符长度 | 
CHARACTER_LENGTH() | 与 CHAR_LENGTH() 功能相同 | 
CONCAT() | 返回连接的字符串 | 
CONCAT_WS() | 返回由分隔符连接的字符串 | 
ELT() | 返回指定位置的字符串 | 
EXPORT_SET() | 返回一个字符串,其中值位中设置的每个位,可以得到一个 on 字符串,而每个未设置的位,可以得到一个 off 字符串 | 
FIELD() | 返回参数在后续参数中出现的第一个位置 | 
FIND_IN_SET() | 返回第一个参数在第二个参数中出现的位置 | 
FORMAT() | 返回指定小数位数格式的数字 | 
FROM_BASE64() | 解码 base-64 表示的字符串,并返回结果 | 
HEX() | 返回一个十进制数或字符串值的 16 进制表示 | 
INSERT() | 在指定位置插入一个子字符串,最多不超过指定字符数 | 
INSTR() | 返回第一次出现的子字符串的索引 | 
LCASE() | 与 LOWER() 功能相同 | 
LEFT() | 返回最左侧指定长度的字符 | 
LENGTH() | 返回字符串长度,单位为字节 | 
LIKE | 进行简单模式匹配 | 
LOCATE() | 返回第一次出现的子字符串的位置 | 
LOWER() | 返回全小写的参数 | 
LPAD() | 返回字符串参数,左侧添加指定字符串 | 
LTRIM() | 去掉前缀空格 | 
MAKE_SET() | 返回一组用逗号分隔的字符串,这些字符串的位数与给定的 bits 参数对应 | 
MID() | 返回一个以指定位置开始的子字符串 | 
NOT LIKE | 否定简单模式匹配 | 
NOT REGEXP | REGEXP 的否定形式 | 
OCT() | 返回一个数值的八进制表示,形式为字符串 | 
OCTET_LENGTH() | 与 LENGTH() 功能相同 | 
ORD() | 返回该参数最左侧字符的字符编码 | 
POSITION() | 与 LOCATE() 功能相同 | 
QUOTE() | 使参数逃逸,为了在 SQL 语句中使用 | 
REGEXP | 使用正则表达式匹配模式 | 
REGEXP_INSTR() | 返回满足正则的子字符串的第一个索引位置(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性) | 
REGEXP_LIKE() | 判断字符串是否满足正则表达式(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性) | 
REGEXP_REPLACE() | 替换满足正则表达式的子字符串(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性) | 
REGEXP_SUBSTR() | 返回满足正则表达式的子字符串(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性) | 
REPEAT() | 以指定次数重复一个字符串 | 
REPLACE() | 替换所有出现的指定字符串 | 
REVERSE() | 反转字符串里的所有字符 | 
RIGHT() | 返回指定数量的最右侧的字符 | 
RLIKE | 与 REGEXP 功能相同 | 
RPAD() | 以指定次数添加字符串 | 
RTRIM() | 去掉后缀空格 | 
SPACE() | 返回指定数量的空格,形式为字符串 | 
STRCMP() | 比较两个字符串 | 
SUBSTR() | 返回指定的子字符串 | 
SUBSTRING() | 返回指定的子字符串 | 
SUBSTRING_INDEX() | 从一个字符串中返回指定出现次数的定界符之前的子字符串 | 
TO_BASE64() | 返回转化为 base-64 表示的字符串参数 | 
TRANSLATE() | 将字符串中出现的所有指定字符替换为其它字符。这个函数不会像 Oracle 一样将空字符串视为NULL | 
TRIM() | 去掉前缀和后缀空格 | 
UCASE() | 与 UPPER() 功能相同 | 
UNHEX() | 返回一个数的十六进制表示,形式为字符串 | 
UPPER() | 参数转换为大写形式 | 
WEIGHT_STRING() | 返回字符串的权重 | 
不支持的函数
LOAD_FILE()MATCH()SOUNDEX()
正则函数与 MySQL 的兼容性
本节介绍 TiDB 中正则函数 REGEXP_INSTR()、REGEXP_LIKE()、REGEXP_REPLACE()、REGEXP_SUBSTR() 与 MySQL 的兼容情况。
语法兼容性
MySQL 的实现使用的是 ICU (International Components for Unicode) 库,TiDB 的实现使用的是 RE2 库,两个库之间的语法差异可以查阅 ICU 文档和 RE2 文档。
匹配模式 match_type 兼容性
TiDB 与 MySQL 在 match_type 上的差异:
TiDB 中
match_type可选值为:"c"、"i"、"m"、"s"。MySQL 中match_type可选值为:"c"、"i"、"m"、"n"、"u"。TiDB 中
"s"对应 MySQL 中的"n",即.字符匹配行结束符。例如:MySQL 中
SELECT REGEXP_LIKE(a, b, "n") FROM t1;在 TiDB 中需要修改为SELECT REGEXP_LIKE(a, b, "s") FROM t1;。TiDB 不支持
match_type为"u"。
数据类型兼容性
TiDB 与 MySQL 在二进制字符串 (binary string) 数据类型上的差异:
- MySQL 8.0.22 及以上版本中正则函数不支持二进制字符串,具体信息可查看 MySQL 文档。但在实际使用过程中,如果所有参数或者返回值的数据类型都是二进制字符串,则正则函数可以正常使用,否则报错。
 - TiDB 目前完全禁止使用二进制字符串,无论什么情况都会报错。
 
其它兼容性
TiDB 与 MySQL 在替换空字符串上的差异:
下面以 REGEXP_REPLACE("", "^$", "123") 为例:
- MySQL 不会对空串进行替换,其结果为 
""。 - TiDB 会对空串进行替换,其结果为 
"123"。