title | aliases | |||
---|---|---|---|---|
字符串函数 |
|
TiDB 支持使用大部分 MySQL 5.7 中提供的字符串函数、一部分 MySQL 8.0 中提供的字符串函数和一部分 Oracle 21 所提供的函数。
关于 Oracle 函数和 TiDB 函数的对照关系,请参考 Oracle 与 TiDB 函数和语法差异对照。
ASCII()
函数用于获取输入的参数中最左字符的 ASCII 值。该参数可以为字符串或数字。
- 如果输入参数不为空,该函数返回参数中最左字符的 ASCII 值。
- 如果输入参数为空,该函数返回
0
。 - 如果输入参数为
NULL
,该函数返回NULL
。
注意:
ASCII()
只能处理那些用 8 个二进制数字(即单个字节)来表示的字符。
示例:
SELECT ASCII('A');
+------------+
| ASCII('A') |
+------------+
| 65 |
+------------+
SELECT ASCII('TiDB');
+---------------+
| ASCII('TiDB') |
+---------------+
| 84 |
+---------------+
SELECT ASCII(23);
+-----------+
| ASCII(23) |
+-----------+
| 50 |
+-----------+
BIN()
函数用于将输入的参数转换为其二进制值的字符串表示形式。该参数可以为字符串或数字。
- 如果输入参数为正数,该函数返回该参数的二进制值的字符串表示形式。
- 如果输入参数为负数,该函数会将该参数的绝对值转换为其二进制值,然后对二进制值的每位取反(
0
变为1
,1
变为0
),最后加上1
。 - 如果输入参数为字符串,且该字符串中只包含数字,该函数将按照该数字返回结果。例如,
"123"
与123
的返回结果相同。 - 如果输入参数为字符串,且该字符串第一个字符不是数字(如
"q123"
),该函数返回0
。 - 如果输入参数为字符串,且该字符串由数字和非数字组成,该函数将按照该参数中最前面连续的数字返回结果。例如,
“123q123”
与123
的返回结果相同。 - 如果输入参数为
NULL
,该函数返回NULL
。
示例:
SELECT BIN(123);
+----------+
| BIN(123) |
+----------+
| 1111011 |
+----------+
SELECT BIN(-7);
+------------------------------------------------------------------+
| BIN(-7) |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111001 |
+------------------------------------------------------------------+
SELECT BIN("123q123");
+----------------+
| BIN("123q123") |
+----------------+
| 1111011 |
+----------------+
返回字符串的位长度
返回由整数的代码值所给出的字符组成的字符串
返回字符串的字符长度
与 CHAR_LENGTH()
功能相同
返回连接的字符串
返回由分隔符连接的字符串
返回指定位置的字符串
返回一个字符串,其中值位中设置的每个位,可以得到一个 on 字符串,而每个未设置的位,可以得到一个 off 字符串
返回参数在后续参数中出现的第一个位置
返回第一个参数在第二个参数中出现的位置
返回指定小数位数格式的数字
解码 base-64 表示的字符串,并返回结果
返回一个十进制数或字符串值的 16 进制表示
在指定位置插入一个子字符串,最多不超过指定字符数
返回第一次出现的子字符串的索引
与 LOWER()
功能相同
返回最左侧指定长度的字符
返回字符串长度,单位为字节
进行简单模式匹配
返回第一次出现的子字符串的位置
返回全小写的参数
返回字符串参数,左侧添加指定字符串
去掉前缀空格
返回一组用逗号分隔的字符串,这些字符串的位数与给定的 bits 参数对应
返回一个以指定位置开始的子字符串
否定简单模式匹配
REGEXP
的否定形式
返回一个数值的八进制表示,形式为字符串
与 LENGTH()
功能相同
返回该参数最左侧字符的字符编码
与 LOCATE()
功能相同
使参数逃逸,为了在 SQL 语句中使用
使用正则表达式匹配模式
返回满足正则的子字符串的第一个索引位置(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性)
判断字符串是否满足正则表达式(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性)
替换满足正则表达式的子字符串(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性)
返回满足正则表达式的子字符串(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性)
以指定次数重复一个字符串
替换所有出现的指定字符串
反转字符串里的所有字符
返回指定数量的最右侧的字符
与 REGEXP
功能相同
以指定次数添加字符串
去掉后缀空格
返回指定数量的空格,形式为字符串
比较两个字符串
返回指定的子字符串
返回指定的子字符串
从一个字符串中返回指定出现次数的定界符之前的子字符串
返回转化为 base-64 表示的字符串参数
将字符串中出现的所有指定字符替换为其它字符。这个函数不会像 Oracle 一样将空字符串视为NULL
去掉前缀和后缀空格
与 UPPER()
功能相同
返回一个数的十六进制表示,形式为字符串
参数转换为大写形式
返回字符串的权重
LOAD_FILE()
MATCH()
SOUNDEX()
本节介绍 TiDB 中正则函数 REGEXP_INSTR()
、REGEXP_LIKE()
、REGEXP_REPLACE()
、REGEXP_SUBSTR()
与 MySQL 的兼容情况。
MySQL 的实现使用的是 ICU (International Components for Unicode) 库,TiDB 的实现使用的是 RE2 库,两个库之间的语法差异可以查阅 ICU 文档和 RE2 文档。
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"
。