Skip to content

Latest commit

 

History

History
364 lines (209 loc) · 13.5 KB

string-functions.md

File metadata and controls

364 lines (209 loc) · 13.5 KB
title aliases
字符串函数
/docs-cn/dev/functions-and-operators/string-functions/
/docs-cn/dev/reference/sql/functions-and-operators/string-functions/
/docs-cn/dev/sql/string-functions/

字符串函数

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 变为 11 变为 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()

正则函数与 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"