字符串函数

TiDB 支持使用 MySQL 8.0 中提供的大部分字符串函数以及 Oracle 21 中提供的部分函数。

关于 Oracle 函数和 TiDB 函数的对照关系,请参考 Oracle 与 TiDB 函数和语法差异对照。

支持的函数

ASCII()

ASCII() 函数用于获取输入的参数中最左字符的 ASCII 值。该参数可以为字符串或数字。

  • 如果输入参数不为空,该函数返回参数中最左字符的 ASCII 值。
  • 如果输入参数为空字符串,该函数返回 0。
  • 如果输入参数为 NULL,该函数返回 NULL。

字符串函数 - 图1

注意

ASCII() 只能处理那些用 8 个二进制数字(即单个字节)来表示的字符。

查询示例:

1. SELECT ASCII('A'), ASCII('TiDB'), ASCII(23);

返回结果:

1. +------------+---------------+-----------+
2. | ASCII('A') | ASCII('TiDB') | ASCII(23) |
3. +------------+---------------+-----------+
4. |         65 |            84 |        50 |
5. +------------+---------------+-----------+

BIN()

BIN() 函数用于将输入的参数转换为其二进制值的字符串表示形式。该参数可以为字符串或数字。

  • 如果输入参数为正数,该函数返回该参数的二进制值的字符串表示形式。
  • 如果输入参数为负数,该函数会将该参数的绝对值转换为其二进制值,然后对二进制值的每位取反(0 变为 1,1 变为 0),最后加上 1。
  • 如果输入参数为字符串,且该字符串中只包含数字,该函数将按照该数字返回结果。例如,"123" 与 123 的返回结果相同。
  • 如果输入参数为字符串,且该字符串第一个字符不是数字(如 "q123"),该函数返回 0。
  • 如果输入参数为字符串,且该字符串由数字和非数字组成,该函数将按照该参数中最前面连续的数字返回结果。例如,'123q123' 与 123 的返回结果相同,但 BIN('123q123') 会产生一个 Truncated incorrect INTEGER value: '123q123' 的警告。
  • 如果输入参数为 NULL,该函数返回 NULL。

查询示例 1:

1. SELECT BIN(123), BIN('123q123');

返回结果 1:

1. +----------+----------------+
2. | BIN(123) | BIN('123q123') |
3. +----------+----------------+
4. | 1111011  | 1111011        |
5. +----------+----------------+

查询示例 2:

1. SELECT BIN(-7);

返回结果 2:

1. +------------------------------------------------------------------+
2. | BIN(-7)                                                          |
3. +------------------------------------------------------------------+
4. | 1111111111111111111111111111111111111111111111111111111111111001 |
5. +------------------------------------------------------------------+

BIT_LENGTH()

BIT_LENGTH() 函数用于返回输入参数的长度,单位为 bit。

示例:

1. SELECT BIT_LENGTH("TiDB");

3. +--------------------+
4. | BIT_LENGTH("TiDB") |
5. +--------------------+
6. |                 32 |
7. +--------------------+

每个字符 8 位 x 4 个字符 = 32 位

1. SELECT BIT_LENGTH("PingCAP 123");

3. +---------------------------+
4. | BIT_LENGTH("PingCAP 123") |
5. +---------------------------+
6. |                        88 |
7. +---------------------------+

每个字符 8 位(空格也会被计算在内,因为它是非字母数字字符) x 11 个字符 = 88 位

1. SELECT CustomerName, BIT_LENGTH(CustomerName) AS BitLengthOfName FROM Customers;

3. +--------------------+-----------------+
4. | CustomerName       | BitLengthOfName |
5. +--------------------+-----------------+
6. | Albert Einstein    |             120 |
7. | Robert Oppenheimer |             144 |
8. +--------------------+-----------------+

字符串函数 - 图2

注意

上面这个示例假设数据库中存在一个名为 Customers 的表,表中有一个名为 CustomerName 的列。

CHAR()

CHAR() 函数用于获取指定 ASCII 值的对应字符。该函数执行的操作与 ASCII() 相反,ASCII() 用于返回指定字符的 ASCII 值。如果提供了多个参数,CHAR() 函数将作用于所有参数并将它们的结果拼接在一起返回。

示例:

1. SELECT CHAR(65);

3. +------------+
4. |  CHAR(65)  |
5. +------------+
6. |          A |
7. +------------+
1. SELECT CHAR(84);

3. +------------+
4. |  CHAR(84)  |
5. +------------+
6. |          T |
7. +------------+

CHAR() 函数还可用于获取超出标准 ASCII 范围(0 - 127)的 ASCII 值的对应字符。

1. /*For extended ASCII: */

3. SELECT CHAR(128);

5. +------------+
6. |  CHAR(128) |
7. +------------+
8. |       0x80 |
9. +------------+

CHAR() 函数还可用于获取 Unicode 值的对应字符。

1. /* For Unicode: */

3. --skip-binary-as-hex

5. SELECT CHAR(50089);

7. +--------------+
8. |  CHAR(50089) |
9. +--------------+
10. |            é |
11. +--------------+
1. SELECT CHAR(65,66,67);
1. +----------------+
2. | CHAR(65,66,67) |
3. +----------------+
4. | ABC            |
5. +----------------+
6. 1 row in set (0.00 sec)

CHAR_LENGTH()

CHAR_LENGTH() 函数用于获取输入参数中字符的总数。

示例:

1. SELECT CHAR_LENGTH("TiDB") AS LengthOfString;

3. +----------------+
4. | LengthOfString |
5. +----------------+
6. |              4 |
7. +----------------+
1. SELECT CustomerName, CHAR_LENGTH(CustomerName) AS LengthOfName FROM Customers;

3. +--------------------+--------------+
4. | CustomerName       | LengthOfName |
5. +--------------------+--------------+
6. | Albert Einstein    |           15 |
7. | Robert Oppenheimer |           18 |
8. +--------------------+--------------+

字符串函数 - 图3

注意

上面这个示例假设数据库中存在一个名为 Customers 的表,表中有一个名为 CustomerName 的列。

CHARACTER_LENGTH()

CHARACTER_LENGTH() 函数与 CHAR_LENGTH() 函数功能相同,返回结果相同,可以互换使用。

CONCAT()

CONCAT() 函数用于将输入的参数连接成一个字符串。

语法:

1. CONCAT(str1,str2,...)

str1, str2, ... 为要连接的参数。该参数可以是字符串或数字。

查询示例:

1. SELECT CONCAT('TiDB', ' ', 'Server', '-', 1, TRUE);

返回结果:

1. +---------------------------------------------+
2. | CONCAT('TiDB', ' ', 'Server', '-', 1, TRUE) |
3. +---------------------------------------------+
4. | TiDB Server-11                              |
5. +---------------------------------------------+

如果任一参数的值为 NULL, 则 CONCAT() 返回 NULL。

查询示例:

1. SELECT CONCAT('TiDB', NULL, 'Server');

返回结果:

1. +--------------------------------+
2. | CONCAT('TiDB', NULL, 'Server') |
3. +--------------------------------+
4. | NULL                           |
5. +--------------------------------+

除了使用 CONCAT() 函数外,你也可以通过字符串彼此相邻的方式获取拼接字符串,但是该方式不支持数字类型。例如:

1. SELECT 'Ti' 'DB' ' ' 'Server';

返回结果:

1. +-------------+
2. | Ti          |
3. +-------------+
4. | TiDB Server |
5. +-------------+

CONCAT_WS()

CONCAT_WS() 函数是一种带分隔符的 CONCAT(),返回由分隔符连接的字符串。

语法:

1. CONCAT_WS(separator,str1,str2,...)
  • separator:第一个参数为分隔符,用于连接其余的不为 NULL 的参数。
  • str1, str2, ...:要连接的参数。该参数可以为字符串或数字。

查询示例:

1. SELECT CONCAT_WS(',', 'TiDB Server', 'TiKV', 'PD');

返回结果:

1. +---------------------------------------------+
2. | CONCAT_WS(',', 'TiDB Server', 'TiKV', 'PD') |
3. +---------------------------------------------+
4. | TiDB Server,TiKV,PD                         |
5. +---------------------------------------------+
  • 如果分隔符为空,则 CONCAT_WS() 等效于 CONCAT(),返回其余参数连接后的字符串。

查询示例:

1. SELECT CONCAT_WS('', 'TiDB Server', 'TiKV', 'PD');

返回结果:

1. +--------------------------------------------+ 2. | CONCAT_WS('', 'TiDB Server', 'TiKV', 'PD') | 3. +--------------------------------------------+ 4. | TiDB ServerTiKVPD | 5. +--------------------------------------------+ - 如果分隔符为 NULL,则 CONCAT_WS()返回 NULL。

查询示例:

1. SELECT CONCAT_WS(NULL, 'TiDB Server', 'TiKV', 'PD');

返回结果:

1. +----------------------------------------------+ 2. | CONCAT_WS(NULL, 'TiDB Server', 'TiKV', 'PD') | 3. +----------------------------------------------+ 4. | NULL | 5. +----------------------------------------------+ - 如果用于连接的参数中只有一个不为 NULL,则 CONCAT_WS() 返回此参数。

查询示例:

1. SELECT CONCAT_WS(',', 'TiDB Server', NULL);

返回结果:

1. +-------------------------------------+ 2. | CONCAT_WS(',', 'TiDB Server', NULL) | 3. +-------------------------------------+ 4. | TiDB Server | 5. +-------------------------------------+ - 如果用于连接的参数中有 NULL,CONCAT_WS()会忽略 NULL。

查询示例:

1. SELECT CONCAT_WS(',', 'TiDB Server', NULL, 'PD');

返回结果:

1. +-------------------------------------------+ 2. | CONCAT_WS(',', 'TiDB Server', NULL, 'PD') | 3. +-------------------------------------------+ 4. | TiDB Server,PD | 5. +-------------------------------------------+ - 如果用于连接的参数中有空字符串,CONCAT_WS() 不会忽略该字符串。

查询示例:

1. SELECT CONCAT_WS(',', 'TiDB Server', '', 'PD');

返回结果:

1. +-----------------------------------------+ 2. | CONCAT_WS(',', 'TiDB Server', '', 'PD') | 3. +-----------------------------------------+ 4. | TiDB Server,,PD | 5. +-----------------------------------------+

ELT()

ELT() 函数返回索引号对应的元素。

1. SELECT ELT(3, 'This', 'is', 'TiDB');
1. +------------------------------+
2. | ELT(3, 'This', 'is', 'TiDB') |
3. +------------------------------+
4. | TiDB                         |
5. +------------------------------+
6. 1 row in set (0.00 sec)

在以上示例中,该函数返回第三个元素,即 'TiDB'。

EXPORT_SET()

EXPORT_SET() 函数返回一个由指定数量 (number_of_bits) 的 on/off 值组成的字符串,各个值之间可以用 separator 分隔(可选)。这些值将基于输入的 bits 参数中的相应 bit 是否为 1 而确定,其中第一个值对应于 bits 中的最右边(即最低)的 bit。

语法:

1. EXPORT_SET(bits, on, off, [separator[, number_of_bits]])
  • bits:一个代表 bits 值的整数。
  • on:如果对应的 bit 为 1,则返回该字符串。
  • off:如果对应的 bit 为 0,则返回该字符串。
  • separator(可选):输出字符串中的分隔符。
  • number_of_bits(可选):要处理的位数。如果未设置,则默认使用 64(最大位数),这意味着 bits 将被视为一个无符号 64 位整数。

示例:

在以下示例中,number_of_bits 设置为 5,因此该函数返回由 | 分隔的 5 个值。'101' 里的 bit 值只有三位,所以其他位被视为未设置。因此,将 number_of_bits 设置为 101 或设置为 00101 的返回结果相同。

1. SELECT EXPORT_SET(b'101',"ON",'off','|',5);
1. +-------------------------------------+
2. | EXPORT_SET(b'101',"ON",'off','|',5) |
3. +-------------------------------------+
4. | ON|off|ON|off|off                   |
5. +-------------------------------------+
6. 1 row in set (0.00 sec)

在以下示例中,bits 设置为 00001111,on 设置为 x,off 设置为 _。这使函数在这些 0 位上返回 ____,在这些 1 位上返回 xxxx。因此,从右到左处理 00001111 中的位时,该函数返回 xxxx____。

1. SELECT EXPORT_SET(b'00001111', 'x', '_', '', 8);
1. +------------------------------------------+
2. | EXPORT_SET(b'00001111', 'x', '_', '', 8) |
3. +------------------------------------------+
4. | xxxx____                                 |
5. +------------------------------------------+
6. 1 row in set (0.00 sec)

在以下示例中,bits 设置为 00001111,on 设置为 x,off 设置为 _。这使函数在每个 1 位上返回 x,在每个 0 位上返回 _。因此,从右到左处理 01010101 中的位时,该函数返回 x_x_x_x_。

1. SELECT EXPORT_SET(b'01010101', 'x', '_', '', 8);
1. +------------------------------------------+
2. | EXPORT_SET(b'01010101', 'x', '_', '', 8) |
3. +------------------------------------------+
4. | x_x_x_x_                                 |
5. +------------------------------------------+
6. 1 row in set (0.00 sec)

FIELD()

返回参数在后续参数中出现的第一个位置

在以下示例中,FIELD() 的第一个参数是 needle,它与后续列表中的第二个参数匹配,因此函数返回 2。

1. SELECT FIELD('needle', 'A', 'needle', 'in', 'a', 'haystack');
2. +-------------------------------------------------------+
3. | FIELD('needle', 'A', 'needle', 'in', 'a', 'haystack') |
4. +-------------------------------------------------------+
5. |                                                     2 |
6. +-------------------------------------------------------+
7. 1 row in set (0.00 sec)

FIND_IN_SET()

返回第一个参数在第二个参数中出现的位置

该函数通常与 SET 数据类型一起使用。

在以下示例中,Go 是集合 COBOL,BASIC,Rust,Go,Java,Fortran 中的第四个元素,因此函数返回 4。

1. SELECT FIND_IN_SET('Go', 'COBOL,BASIC,Rust,Go,Java,Fortran');
2. +-------------------------------------------------------+
3. | FIND_IN_SET('Go', 'COBOL,BASIC,Rust,Go,Java,Fortran') |
4. +-------------------------------------------------------+
5. |                                                     4 |
6. +-------------------------------------------------------+
7. 1 row in set (0.00 sec)

FORMAT()

FORMAT(X,D[,locale]) 函数用于将数字 X 格式化为类似于 “#,###,###.##” 的格式,四舍五入保留 D 位小数,并将结果作为字符串返回。

参数:

  • X:要格式化的数字。可以是直接的数字值、数字字符串、或科学记数法格式的数字。
  • D:指定返回值的小数位数。该函数根据 D 对 X 进行四舍五入。如果 D 大于 X 的实际小数位数,则会在结果中填充相应长度的零。
  • [locale]:指定一个区域设置,用于结果中数字的小数点、千位分隔符和分隔符之间的分组。合法的区域设置值与 lc_time_names 系统变量的合法值相同。如果未指定或者设置为 NULL,则默认使用 'en_US' 区域设置。该参数可选。

行为细节:

  • 如果输入的第一个参数为字符串,且该字符串中只包含数字时,该函数将按照该数字返回结果。例如,FORMAT('12.36', 1) 与 FORMAT(12.36, 1) 的返回结果相同。
  • 如果输入的第一个参数为科学计数法(E/e)表示的数字时,该函数将按照该数字返回结果。例如,FORMAT('1E2', 3)),函数返回 100.000。
  • 如果输入的第一个参数为非数字开头的字符串时,该函数除了返回零值外,还返回一个警告 (Code 1292)。例如,FORMAT('q12.36', 5) 函数返回 0.00000,还会包含一个警告 Warning (Code 1292): Truncated incorrect DOUBLE value: 'q12.36'。
  • 如果输入的第一个参数为数字和非数字混合的字符串时,该函数将基于该参数中开头连续的数字部分返回结果,还返回一个警告 (Code 1292)。例如,FORMAT('12.36q56.78', 1) 与 FORMAT('12.36', 1) 的返回的数字结果相同,但 FORMAT('12.36q56.78', 1) 还会包含一个警告 Warning (Code 1292): Truncated incorrect DOUBLE value: '12.36q56.78'。
  • 如果输入的第二个参数为零或负数,该函数将四舍五入小数部分并返回整数。
  • 如果输入的任意参数为 NULL,函数将返回 NULL。

示例:

格式化数字 12.36 到不同的小数位数:

1. mysql> SELECT FORMAT(12.36, 1);
2. +------------------+
3. | FORMAT(12.36, 1) |
4. +------------------+
5. | 12.4             |
6. +------------------+
1. mysql> SELECT FORMAT(12.36, 5);
2. +------------------+
3. | FORMAT(12.36, 5) |
4. +------------------+
5. | 12.36000         |
6. +------------------+
1. mysql> SELECT FORMAT(1234.56, 1, 'en_US');
2. +-----------------------------+
3. | FORMAT(1234.56, 1, 'en_US') |
4. +-----------------------------+
5. | 1,234.6                     |
6. +-----------------------------+

FROM_BASE64()

FROM_BASE64(str) 函数用于对 Base64 编码的字符串进行解码,并将解码结果以十六进制字符串的形式返回。

  • 此函数接受一个单一参数,即需要解码的 Base64 编码字符串。
  • 如果输入参数为 NULL 或无效的 Base64 编码字符串,FROM_BASE64() 函数将返回 NULL。

示例:

以下示例解码 Base64 编码的字符串 'SGVsbG8gVGlEQg==',该字符串是 'Hello TiDB' 经过 TO_BASE64() 函数编码的结果。

1. mysql> SELECT TO_BASE64('Hello TiDB');
2. +-------------------------+
3. | TO_BASE64('Hello TiDB') |
4. +-------------------------+
5. | SGVsbG8gVGlEQg==        |
6. +-------------------------+

8. mysql> SELECT FROM_BASE64('SGVsbG8gVGlEQg==');
9. +------------------------------------------------------------------+
10. | FROM_BASE64('SGVsbG8gVGlEQg==')                                  |
11. +------------------------------------------------------------------+
12. | 0x48656C6C6F2054694442                                           |
13. +------------------------------------------------------------------+
1. mysql> SELECT CONVERT(FROM_BASE64('SGVsbG8gVGlEQg==') USING utf8mb4);
2. +--------------------------------------------------------+
3. | CONVERT(FROM_BASE64('SGVsbG8gVGlEQg==') USING utf8mb4) |
4. +--------------------------------------------------------+
5. | Hello TiDB                                             |
6. +--------------------------------------------------------+

以下示例解码 Base64 编码的数字 MTIzNDU2,该字符串是 123456 经过 TO_BASE64() 函数编码的结果。

1. mysql> SELECT FROM_BASE64('MTIzNDU2');
2. +--------------------------------------------------+
3. | FROM_BASE64('MTIzNDU2')                          |
4. +--------------------------------------------------+
5. | 0x313233343536                                   |
6. +--------------------------------------------------+

HEX()

HEX() 函数用于将输入的参数转换为其十六进制值的字符串表示形式。该参数可以为字符串或数字。

  • 如果输入参数为字符串,HEX(str) 返回 str 的十六进制字符串表示。该函数将 str 中每个字符的每个字节转换为两个十六进制数字。例如,在 UTF-8 或 ASCII 字符集中,字符 a 的二进制表示为 00111101,十六进制表示为 61。
  • 如果输入参数为数字,HEX(n) 返回 n 的十六进制字符串表示。该函数将参数 n 视为 BIGINT 数字,相当于 CONV(n, 10, 16)。
  • 如果输入参数为 NULL,该函数返回 NULL。

示例:

1. SELECT X'616263', HEX('abc'), UNHEX(HEX('abc')), 0x616263;
2. +-----------+------------+-------------------+----------+
3. | X'616263' | HEX('abc') | UNHEX(HEX('abc')) | 0x616263 |
4. +-----------+------------+-------------------+----------+
5. | abc       | 616263     | abc               | abc      |
6. +-----------+------------+-------------------+----------+
1. SELECT X'F09F8DA3', HEX('🍣'), UNHEX(HEX('🍣')), 0xF09F8DA3;
2. +-------------+-------------+--------------------+------------+
3. | X'F09F8DA3' | HEX('🍣')     | UNHEX(HEX('🍣'))     | 0xF09F8DA3 |
4. +-------------+-------------+--------------------+------------+
5. | 🍣            | F09F8DA3    | 🍣                   | 🍣           |
6. +-------------+-------------+--------------------+------------+
1. SELECT HEX(255), CONV(HEX(255), 16, 10);
2. +----------+------------------------+
3. | HEX(255) | CONV(HEX(255), 16, 10) |
4. +----------+------------------------+
5. | FF       | 255                    |
6. +----------+------------------------+
1. SELECT HEX(NULL);
2. +-----------+
3. | HEX(NULL) |
4. +-----------+
5. | NULL      |
6. +-----------+

INSERT()

INSERT(str, pos, len, newstr) 函数用于将字符串 str 中的一个子字符串(从位置 pos 开始,长度为 len)替换为字符串 newstr。该函数是多字节安全的。

  • 如果 pos 超过了 str 的长度,函数返回原始字符串 str 而不做修改。
  • 如果 len 超过了从位置 pos 开始的 str 的剩余长度,函数将从位置 pos 开始替换字符串的其余部分。
  • 如果任一参数为 NULL,该函数返回 NULL。

示例:

1. SELECT INSERT('He likes tennis', 4, 5, 'plays');
2. +------------------------------------------+
3. | INSERT('He likes tennis', 4, 5, 'plays') |
4. +------------------------------------------+
5. | He plays tennis                          |
6. +------------------------------------------+
1. SELECT INSERT('He likes tennis', -1, 5, 'plays');
2. +-------------------------------------------+
3. | INSERT('He likes tennis', -1, 5, 'plays') |
4. +-------------------------------------------+
5. | He likes tennis                           |
6. +-------------------------------------------+
1. SELECT INSERT('He likes tennis', 4, 100, 'plays');
2. +--------------------------------------------+
3. | INSERT('He likes tennis', 4, 100, 'plays') |
4. +--------------------------------------------+
5. | He plays                                   |
6. +--------------------------------------------+
1. SELECT INSERT('He likes tennis', 10, 100, '🍣');
2. +-------------------------------------------+
3. | INSERT('He likes tennis', 10, 100, '🍣')     |
4. +-------------------------------------------+
5. | He likes 🍣                                 |
6. +-------------------------------------------+
1. SELECT INSERT('PingCAP 数据库', 1, 7, 'TiDB');
2. +-------------------------------------------+
3. | INSERT('PingCAP 数据库', 1, 7, 'TiDB')    |
4. +-------------------------------------------+
5. | TiDB 数据库                               |
6. +-------------------------------------------+

INSTR()

INSTR(str, substr) 函数用于获取子字符串 substr 在字符串 str 中第一次出现的位置。substr 和 str 均可以为字符串或数字。该函数与 LOCATE(substr, str) 函数的两参数版本功能相同,但参数顺序相反。

字符串函数 - 图4

注意

INSTR(str, substr) 函数是否区分大小取决于 TiDB 所使用的排序规则。二进制排序规则(以 _bin 为后缀)区分大小写,而通用排序规则(以 _general_ci 或 _ai_ci 为后缀)不区分大小写。

  • 如果任一输入参数为数字,该函数将数字视为字符串处理。
  • 如果 substr 不在 str 中,函数返回 0。否则,返回 substr 在 str 中第一次出现的位置。
  • 如果任一参数为 NULL,该函数返回 NULL。

示例:

1. SELECT INSTR("pingcap.com", "tidb");
2. +------------------------------+
3. | INSTR("pingcap.com", "tidb") |
4. +------------------------------+
5. |                            0 |
6. +------------------------------+
1. SELECT INSTR("pingcap.com/tidb", "tidb");
2. +-----------------------------------+
3. | INSTR("pingcap.com/tidb", "tidb") |
4. +-----------------------------------+
5. |                                13 |
6. +-----------------------------------+
1. SELECT INSTR("pingcap.com/tidb" COLLATE utf8mb4_bin, "TiDB");
2. +-------------------------------------------------------+
3. | INSTR("pingcap.com/tidb" COLLATE utf8mb4_bin, "TiDB") |
4. +-------------------------------------------------------+
5. |                                                     0 |
6. +-------------------------------------------------------+
1. SELECT INSTR("pingcap.com/tidb" COLLATE utf8mb4_general_ci, "TiDB");
2. +--------------------------------------------------------------+
3. | INSTR("pingcap.com/tidb" COLLATE utf8mb4_general_ci, "TiDB") |
4. +--------------------------------------------------------------+
5. |                                                           13 |
6. +--------------------------------------------------------------+
1. SELECT INSTR(0123, "12");
2. +-------------------+
3. | INSTR(0123, "12") |
4. +-------------------+
5. |                 1 |
6. +-------------------+

LCASE()

LCASE(str)函数与 LOWER(str) 函数功能相同,都是返回输入参数的小写形式。

LEFT()

LEFT() 函数用于返回字符串左侧指定数量的字符。

语法:

1. LEFT(`str`, `len`)
  • str:要提取字符的原始字符串。如果 str 包含一个多字节字符,该函数将其视为一个字符。
  • len:要返回的字符长度。
  • 如果 len 小于或等于 0,该函数返回空字符串。
  • 如果 len 大于或等于 str 的长度,该函数将返回原始的 str。
  • 如果任何参数为 NULL,该函数返回 NULL。

示例:

1. SELECT LEFT('ABCED', 3);
2. +------------------+
3. | LEFT('ABCED', 3) |
4. +------------------+
5. | ABC              |
6. +------------------+

8. SELECT LEFT('ABCED', 6);
9. +------------------+
10. | LEFT('ABCED', 6) |
11. +------------------+
12. | ABCED            |
13. +------------------+
1. SELECT LEFT('ABCED', 0);
2. +------------------+
3. | LEFT('ABCED', 0) |
4. +------------------+
5. |                  |
6. +------------------+

8. SELECT LEFT('ABCED', -1);
9. +-------------------+
10. | LEFT('ABCED', -1) |
11. +-------------------+
12. |                   |
13. +-------------------+
1. SELECT LEFT('🍣ABC', 3);
2. +--------------------+
3. | LEFT('🍣ABC', 3)     |
4. +--------------------+
5. | 🍣AB                 |
6. +--------------------+
1. SELECT LEFT('ABC', NULL);
2. +-------------------+
3. | LEFT('ABC', NULL) |
4. +-------------------+
5. | NULL              |
6. +-------------------+

8. SELECT LEFT(NULL, 3);
9. +------------------------------+
10. | LEFT(NULL, 3)                |
11. +------------------------------+
12. | NULL                         |
13. +------------------------------+

LENGTH()

LENGTH() 函数用于返回字符串的字节长度。LENGTH() 将单个多字节字符视为多个字节,而 CHAR_LENGTH() 将单个多字节字符视为单个字符。

如果输入参数为 NULL,该函数将返回 NULL。

示例:

1. SELECT LENGTH('ABC');
2. +---------------+
3. | LENGTH('ABC') |
4. +---------------+
5. |             3 |
6. +---------------+

8. SELECT LENGTH('🍣ABC');
9. +-------------------+
10. | LENGTH('🍣ABC')     |
11. +-------------------+
12. |                 7 |
13. +-------------------+

15. SELECT CHAR_LENGTH('🍣ABC');
16. +------------------------+
17. | CHAR_LENGTH('🍣ABC')     |
18. +------------------------+
19. |                      4 |
20. +------------------------+
1. SELECT LENGTH(NULL);
2. +--------------+
3. | LENGTH(NULL) |
4. +--------------+
5. |         NULL |
6. +--------------+

LIKE

LIKE 用于进行简单字符串匹配。表达式 expr LIKE pat [ESCAPE 'escape_char'] 返回 1 (TRUE) 或 0 (FALSE)。如果 expr 或 pat 中任一个为 NULL,结果为 NULL。

你可以在 LIKE 中使用以下两个通配符:

  • % 匹配任意数量的字符,包括零个字符。
  • _ 精确匹配一个字符。

以下示例使用 utf8mb4_bin 排序规则:

1. SET collation_connection='utf8mb4_bin';
2. SHOW VARIABLES LIKE 'collation_connection';
3. +----------------------+-------------+
4. | Variable_name        | Value       |
5. +----------------------+-------------+
6. | collation_connection | utf8mb4_bin |
7. +----------------------+-------------+
1. SELECT NULL LIKE '%' as result;
2. +--------+
3. | result |
4. +--------+
5. |   NULL |
6. +--------+
1. SELECT 'sushi!!!' LIKE 'sushi_' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      0 |
6. +--------+
1. SELECT '🍣🍺sushi🍣🍺' LIKE '%sushi%' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      1 |
6. +--------+
1. SELECT '🍣🍺sushi🍣🍺' LIKE '%SUSHI%' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      0 |
6. +--------+
1. SELECT '🍣🍺sushi🍣🍺' LIKE '%🍣%' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      1 |
6. +--------+

默认的转义字符是 \:

1. SELECT 'sushi!!!' LIKE 'sushi\_' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      0 |
6. +--------+
1. SELECT 'sushi_' LIKE 'sushi\_' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      1 |
6. +--------+

你可以使用 ESCAPE 子句指定一个不同的转义字符,例如 *:

1. SELECT 'sushi_' LIKE 'sushi*_' ESCAPE '*' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      1 |
6. +--------+
1. SELECT 'sushi!' LIKE 'sushi*_' ESCAPE '*' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      0 |
6. +--------+

你可以使用 LIKE 匹配一个数字:

1. SELECT 10 LIKE '1%' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      1 |
6. +--------+
1. SELECT 10000 LIKE '12%' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      0 |
6. +--------+

你可以使用 COLLATE 显式指定一个排序规则,例如 utf8mb4_unicode_ci:

1. SELECT '🍣🍺Sushi🍣🍺' COLLATE utf8mb4_unicode_ci LIKE '%SUSHI%' AS result;
2. +--------+
3. | result |
4. +--------+
5. |      1 |
6. +--------+

LOCATE()

LOCATE(substr, str[, pos]) 函数用于返回子字符串 substr 在字符串 str 中第一次出现的位置。pos 参数是可选的,用于指定查找的起始位置。

  • 如果子字符串 substr 不在字符串 str 中,该函数返回 0。
  • 如果任一参数为 NULL,该函数返回 NULL。
  • 该函数是多字节安全的,并且只有当至少一个参数是二进制字符串时,才执行区分大小写的查找。

以下示例使用 utf8mb4_bin 排序规则:

1. SET collation_connection='utf8mb4_bin';
2. SHOW VARIABLES LIKE 'collation_connection';
3. +----------------------+-------------+
4. | Variable_name        | Value       |
5. +----------------------+-------------+
6. | collation_connection | utf8mb4_bin |
7. +----------------------+-------------+
1. SELECT LOCATE('bar', 'foobarbar');
2. +----------------------------+
3. | LOCATE('bar', 'foobarbar') |
4. +----------------------------+
5. |                          4 |
6. +----------------------------+
1. SELECT LOCATE('baz', 'foobarbar');
2. +----------------------------+
3. | LOCATE('baz', 'foobarbar') |
4. +----------------------------+
5. |                          0 |
6. +----------------------------+
1. SELECT LOCATE('bar', 'fooBARBAR');
2. +----------------------------+
3. | LOCATE('bar', 'fooBARBAR') |
4. +----------------------------+
5. |                          0 |
6. +----------------------------+
1. SELECT LOCATE('bar', 'foobarBAR', 100);
2. +---------------------------------+
3. | LOCATE('bar', 'foobarBAR', 100) |
4. +---------------------------------+
5. |                               0 |
6. +---------------------------------+
1. SELECT LOCATE('bar', 'foobarbar', 5);
2. +-------------------------------+
3. | LOCATE('bar', 'foobarbar', 5) |
4. +-------------------------------+
5. |                             7 |
6. +-------------------------------+
1. SELECT LOCATE('bar', NULL);
2. +---------------------+
3. | LOCATE('bar', NULL) |
4. +---------------------+
5. |                NULL |
6. +---------------------+
1. SELECT LOCATE('DB', 'TiDB tidb 数据库');
2. +-------------------------------------+
3. | LOCATE('DB', 'TiDB tidb 数据库')    |
4. +-------------------------------------+
5. |                                   3 |
6. +-------------------------------------+
1. SELECT LOCATE('DB', 'TiDB tidb 数据库', 4);
2. +----------------------------------------+
3. | LOCATE('DB', 'TiDB tidb 数据库', 4)    |
4. +----------------------------------------+
5. |                                      0 |
6. +----------------------------------------+

以下示例使用 utf8mb4_unicode_ci 排序规则:

1. SET collation_connection='utf8mb4_unicode_ci';
2. SHOW VARIABLES LIKE 'collation_connection';
3. +----------------------+--------------------+
4. | Variable_name        | Value              |
5. +----------------------+--------------------+
6. | collation_connection | utf8mb4_unicode_ci |
7. +----------------------+--------------------+
1. SELECT LOCATE('DB', 'TiDB tidb 数据库', 4);
2. +----------------------------------------+
3. | LOCATE('DB', 'TiDB tidb 数据库', 4)    |
4. +----------------------------------------+
5. |                                      8 |
6. +----------------------------------------+
1. SELECT LOCATE('🍺', '🍣🍣🍣🍺🍺');
2. +----------------------------------------+
3. | LOCATE('🍺', '🍣🍣🍣🍺🍺')            |
4. +----------------------------------------+
5. |                                      1 |
6. +----------------------------------------+

以下多字节和二进制字符串示例使用 utf8mb4_bin 排序规则:

1. SET collation_connection='utf8mb4_bin';
2. SHOW VARIABLES LIKE 'collation_connection';
3. +----------------------+-------------+
4. | Variable_name        | Value       |
5. +----------------------+-------------+
6. | collation_connection | utf8mb4_bin |
7. +----------------------+-------------+
1. SELECT LOCATE('🍺', '🍣🍣🍣🍺🍺');
2. +----------------------------------------+
3. | LOCATE('🍺', '🍣🍣🍣🍺🍺')                         |
4. +----------------------------------------+
5. |                                      4 |
6. +----------------------------------------+
1. SELECT LOCATE('b', _binary'aBcde');
2. +-----------------------------+
3. | LOCATE('b', _binary'aBcde') |
4. +-----------------------------+
5. |                           0 |
6. +-----------------------------+
1. SELECT LOCATE('B', _binary'aBcde');
2. +-----------------------------+
3. | LOCATE('B', _binary'aBcde') |
4. +-----------------------------+
5. |                           2 |
6. +-----------------------------+
1. SELECT LOCATE(_binary'b', 'aBcde');
2. +-----------------------------+
3. | LOCATE(_binary'b', 'aBcde') |
4. +-----------------------------+
5. |                           0 |
6. +-----------------------------+
1. SELECT LOCATE(_binary'B', 'aBcde');
2. +-----------------------------+
3. | LOCATE(_binary'B', 'aBcde') |
4. +-----------------------------+
5. |                           2 |
6. +-----------------------------+

LOWER()

LOWER(str) 函数用于将输入的参数 str 中的所有字符转换为小写。该参数可以为字符串或数字。

  • 如果输入参数为字符串,该函数返回字符串的小写形式。
  • 如果输入参数为数字,该函数将会去掉该数字中的前导零。
  • 如果输入参数为 NULL,该函数返回 NULL。

示例:

1. SELECT LOWER("TiDB");

3. +---------------+
4. | LOWER("TiDB") |
5. +---------------+
6. | tidb          |
7. +---------------+
1. SELECT LOWER(-012);

3. +-------------+
4. | LOWER(-012) |
5. +-------------+
6. | -12         |
7. +-------------+

LPAD()

LPAD(str, len, padstr) 函数返回字符串参数,左侧填充指定字符串 padstr,直到字符串长度达到 len 个字符。

  • 如果 len 小于字符串 str 的长度,函数将字符串 str 截断到长度 len。
  • 如果 len 为负数,函数返回 NULL。
  • 如果任一参数为 NULL,该函数返回 NULL。

示例:

1. SELECT LPAD('TiDB',8,'>');
2. +--------------------+
3. | LPAD('TiDB',8,'>') |
4. +--------------------+
5. | >>>>TiDB           |
6. +--------------------+
7. 1 row in set (0.00 sec)
1. SELECT LPAD('TiDB',2,'>');
2. +--------------------+
3. | LPAD('TiDB',2,'>') |
4. +--------------------+
5. | Ti                 |
6. +--------------------+
7. 1 row in set (0.00 sec)
1. SELECT LPAD('TiDB',-2,'>');
2. +---------------------+
3. | LPAD('TiDB',-2,'>') |
4. +---------------------+
5. | NULL                |
6. +---------------------+
7. 1 row in set (0.00 sec)

LTRIM()

LTRIM() 函数用于删除给定的字符串中的前导空格(即字符串开头的连续空格)。

如果输入的参数为 NULL,该函数将返回 NULL。

字符串函数 - 图5

注意

该函数只去掉空格字符(U+0020),不去掉其他类似空格的字符,如制表符(U+0009)或非分隔符(U+00A0)。

示例:

在以下示例中,LTRIM() 函数删除了 ' hello' 中的前导空格,并返回 hello。

1. SELECT LTRIM('    hello');
1. +--------------------+
2. | LTRIM('    hello') |
3. +--------------------+
4. | hello              |
5. +--------------------+
6. 1 row in set (0.00 sec)

在以下示例中,CONCAT() 用于将 LTRIM(' hello') 的结果用 « 和 » 包裹起来。通过这种格式,可以更容易地看到所有前导空格都被删除了。

1. SELECT CONCAT('«',LTRIM('    hello'),'»');
1. +------------------------------------+
2. | CONCAT('«',LTRIM('    hello'),'»') |
3. +------------------------------------+
4. | «hello»                            |
5. +------------------------------------+
6. 1 row in set (0.00 sec)

MAKE_SET()

MAKE_SET() 函数根据输入的 bits 参数中相应的 bit 是否为 1 返回一组由逗号分隔的字符串。

语法:

1. MAKE_SET(bits, str1, str2, ...)
  • bits:控制其后的字符串参数中的哪些参数会包含到输出结果中。如果 bits 为 NULL,该函数将返回 NULL。
  • str1, str2, ...:字符串参数列表。每个字符串与 bits 参数中从右到左的一个 bit 依次对应。str1 对应于 bits 中从右起的第一个 bit,str2 对应于从右起的第二个 bit,依此类推。如果相应的 bit 为 1,则该字符串将包含在输出结果中;否则,将不包含在输出结果中。

示例:

在以下示例中,因为 bits 参数中的所有 bit 都为 0,该函数将不会在结果中包含 bits 后的任何字符串参数,因此返回空字符串。

1. SELECT MAKE_SET(b'000','foo','bar','baz');
1. +------------------------------------+
2. | MAKE_SET(b'000','foo','bar','baz') |
3. +------------------------------------+
4. |                                    |
5. +------------------------------------+
6. 1 row in set (0.00 sec)

在以下示例中,因为只有从右起的第一个 bit 为 1,该函数只返回第一个字符串 foo。

1. SELECT MAKE_SET(b'001','foo','bar','baz');
1. +------------------------------------+
2. | MAKE_SET(b'001','foo','bar','baz') |
3. +------------------------------------+
4. | foo                                |
5. +------------------------------------+
6. 1 row in set (0.00 sec)

在以下示例中,因为只有从右起的第二个 bit 为 1,该函数只返回第二个字符串 bar。

1. SELECT MAKE_SET(b'010','foo','bar','baz');
1. +------------------------------------+
2. | MAKE_SET(b'010','foo','bar','baz') |
3. +------------------------------------+
4. | bar                                |
5. +------------------------------------+
6. 1 row in set (0.00 sec)

在以下示例中,因为只有从右起的第三个 bit 为 1,该函数只返回第三个字符串 baz。

1. SELECT MAKE_SET(b'100','foo','bar','baz');
1. +------------------------------------+
2. | MAKE_SET(b'100','foo','bar','baz') |
3. +------------------------------------+
4. | baz                                |
5. +------------------------------------+
6. 1 row in set (0.00 sec)

在以下示例中,因为所有 bit 都为 1,该函数将返回全部的三个字符串,并以逗号分隔。

1. SELECT MAKE_SET(b'111','foo','bar','baz');
1. +------------------------------------+
2. | MAKE_SET(b'111','foo','bar','baz') |
3. +------------------------------------+
4. | foo,bar,baz                        |
5. +------------------------------------+
6. 1 row in set (0.0002 sec)

MID()

MID(str,pos,len) 函数返回从指定的 pos 位置开始的长度为 len 的子字符串。

如果任一参数为 NULL,该函数将返回 NULL。

TiDB 不支持该函数的两参数版本。更多信息,请参见 #52420。

示例:

在以下示例中,MID() 返回给定的字符串中从第二个字符 (b) 开始的长度为 3 个字符的的子字符串。

1. SELECT MID('abcdef',2,3);
1. +-------------------+
2. | MID('abcdef',2,3) |
3. +-------------------+
4. | bcd               |
5. +-------------------+
6. 1 row in set (0.00 sec)

NOT LIKE

否定简单模式匹配。

该函数的功能与 LIKE 函数相反。

示例:

在以下示例中,因为 aaa 匹配 a% 模式,NOT LIKE 返回 0(代表结果为 False)。

1. SELECT 'aaa' LIKE 'a%', 'aaa' NOT LIKE 'a%';
1. +-----------------+---------------------+
2. | 'aaa' LIKE 'a%' | 'aaa' NOT LIKE 'a%' |
3. +-----------------+---------------------+
4. |               1 |                   0 |
5. +-----------------+---------------------+
6. 1 row in set (0.00 sec)

在以下示例中,因为 aaa 与 b% 模式不匹配,NOT LIKE 返回 1(代表结果为 True)。

1. SELECT 'aaa' LIKE 'b%', 'aaa' NOT LIKE 'b%';
1. +-----------------+---------------------+
2. | 'aaa' LIKE 'b%' | 'aaa' NOT LIKE 'b%' |
3. +-----------------+---------------------+
4. |               0 |                   1 |
5. +-----------------+---------------------+
6. 1 row in set (0.00 sec)

NOT REGEXP

REGEXP 的否定形式

OCT()

OCT() 函数用于返回一个数值的八进制表示,形式为字符串。

示例:

以下示例使用递归的公共表表达式 (CTE) 生成从 0 到 20 的数字序列,然后使用 OCT() 函数将每个数字转换为其八进制表示。从 0 到 7 的十进制数在八进制中有相同的表示,从 8 到 15 的十进制数对应从 10 到 17 的八进制数。

1. WITH RECURSIVE nr(n) AS (
2. SELECT 0 AS n
3. UNION ALL
4. SELECT n+1 FROM nr WHERE n<20
5. )
6. SELECT n, OCT(n) FROM nr;
1. +------+--------+
2. | n    | OCT(n) |
3. +------+--------+
4. |    0 | 0      |
5. |    1 | 1      |
6. |    2 | 2      |
7. |    3 | 3      |
8. |    4 | 4      |
9. |    5 | 5      |
10. |    6 | 6      |
11. |    7 | 7      |
12. |    8 | 10     |
13. |    9 | 11     |
14. |   10 | 12     |
15. |   11 | 13     |
16. |   12 | 14     |
17. |   13 | 15     |
18. |   14 | 16     |
19. |   15 | 17     |
20. |   16 | 20     |
21. |   17 | 21     |
22. |   18 | 22     |
23. |   19 | 23     |
24. |   20 | 24     |
25. +------+--------+
26. 20 rows in set (0.00 sec)

OCTET_LENGTH()

与 LENGTH() 功能相同

ORD()

返回给定的参数中最左侧字符的字符编码。

该函数的功能类似于 CHAR(),但处理方式相反。

示例:

以 a 和 A 为例,ORD() 返回 a 的字符代码 97 和 A 的字符代码 65。

1. SELECT ORD('a'), ORD('A');
1. +----------+----------+
2. | ORD('a') | ORD('A') |
3. +----------+----------+
4. |       97 |       65 |
5. +----------+----------+
6. 1 row in set (0.00 sec)

如果将从 ORD() 获得的字符代码作为 CHAR() 函数的输入,即可获取原始字符。请注意,以下输出的格式可能会根据你的 MySQL 客户端是否启用了 binary-as-hex 选项而有所不同。

1. SELECT CHAR(97), CHAR(65);
1. +----------+----------+
2. | CHAR(97) | CHAR(65) |
3. +----------+----------+
4. | a        | A        |
5. +----------+----------+
6. 1 row in set (0.01 sec)

以下示例展示了 ORD() 如何处理多字节字符。101 和 0x65 都是 e 字符的 UTF-8 编码值,但格式不同。50091 和 0xC3AB 也表示的是相同的值,但对应 ë 字符。

1. SELECT ORD('e'), ORD('ë'), HEX('e'), HEX('ë');
1. +----------+-----------+----------+-----------+
2. | ORD('e') | ORD('ë')  | HEX('e') | HEX('ë')  |
3. +----------+-----------+----------+-----------+
4. |      101 |     50091 | 65       | C3AB      |
5. +----------+-----------+----------+-----------+
6. 1 row in set (0.00 sec)

POSITION()

与 LOCATE() 功能相同

QUOTE()

QUOTE() 函数用于转义字符串,使其可以在 SQL 语句中使用。

如果输入参数为 NULL,该函数返回 NULL。

示例:

为了直接显示查询结果,而不是以十六进制编码的形式展示,你需要使用 --skip-binary-as-hex 选项启动 MySQL 客户端。

以下示例显示了 ASCII NULL 字符被转义为 \0,单引号字符 ' 被转义为 \':

1. SELECT QUOTE(0x002774657374);
1. +-----------------------+
2. | QUOTE(0x002774657374) |
3. +-----------------------+
4. | '\0\'test'            |
5. +-----------------------+
6. 1 row in set (0.00 sec)

REGEXP

使用正则表达式匹配模式

示例:

下面示例使用了两个正则表达式来匹配一些字符串。

1. WITH vals AS (
2. SELECT 'TiDB' AS v
3. UNION ALL
4. SELECT 'Titanium'
5. UNION ALL
6. SELECT 'Tungsten'
7. UNION ALL
8. SELECT 'Rust'
9. )
10. SELECT
11. v,
12. v REGEXP '^Ti' AS 'starts with "Ti"',
13. v REGEXP '^.{4}$' AS 'Length is 4 characters'
14. FROM
15. vals;
1. +----------+------------------+------------------------+
2. | v        | starts with "Ti" | Length is 4 characters |
3. +----------+------------------+------------------------+
4. | TiDB     |                1 |                      1 |
5. | Titanium |                1 |                      0 |
6. | Tungsten |                0 |                      0 |
7. | Rust     |                0 |                      1 |
8. +----------+------------------+------------------------+
9. 4 rows in set (0.00 sec)

REGEXP 并不限于只在 SELECT 子句中使用。例如,REGEXP 还可以用于查询的 WHERE 子句中。

1. SELECT
2. v
3. FROM (
4. SELECT 'TiDB' AS v
5. ) AS vals
6. WHERE
7. v REGEXP 'DB$';
1. +------+
2. | v    |
3. +------+
4. | TiDB |
5. +------+
6. 1 row in set (0.01 sec)

REGEXP_INSTR()

返回满足正则的子字符串的第一个索引位置(与 MySQL 不完全兼容,具体请参考正则函数与 MySQL 的兼容性)

REGEXP_INSTR(str, regexp, [start, [match, [ret, [match_type]]]]) 函数返回正则表达式(regexp)匹配字符串(str)的位置。

如果 str 或 regexp 为 NULL,则该函数返回 NULL。

示例:

下面示例展示了 ^.b.$ 匹配 abc 的情况。

1. SELECT REGEXP_INSTR('abc','^.b.$');
1. +-----------------------------+
2. | REGEXP_INSTR('abc','^.b.$') |
3. +-----------------------------+
4. |                           1 |
5. +-----------------------------+
6. 1 row in set (0.00 sec)

下面示例展示了使用第三个参数来从字符串的指定位置起查找匹配值的情况。

1. SELECT REGEXP_INSTR('abcabc','a');
1. +----------------------------+
2. | REGEXP_INSTR('abcabc','a') |
3. +----------------------------+
4. |                          1 |
5. +----------------------------+
6. 1 row in set (0.00 sec)
1. SELECT REGEXP_INSTR('abcabc','a',2);
1. +------------------------------+
2. | REGEXP_INSTR('abcabc','a',2) |
3. +------------------------------+
4. |                            4 |
5. +------------------------------+
6. 1 row in set (0.00 sec)

下面示例展示了使用第四个参数来查找第二个匹配值的情况。

1. SELECT REGEXP_INSTR('abcabc','a',1,2);
1. +--------------------------------+
2. | REGEXP_INSTR('abcabc','a',1,2) |
3. +--------------------------------+
4. |                              4 |
5. +--------------------------------+
6. 1 row in set (0.00 sec)

下面示例展示了使用第五个参数来返回匹配值后面的那个值的位置,而不是返回匹配值的位置。

1. SELECT REGEXP_INSTR('abcabc','a',1,1,1);
1. +----------------------------------+
2. | REGEXP_INSTR('abcabc','a',1,1,1) |
3. +----------------------------------+
4. |                                2 |
5. +----------------------------------+
6. 1 row in set (0.00 sec)

下面示例展示了使用第六个参数来添加 i 标志以获得不区分大小写的匹配。有关正则表达式 match_type 的更多详细信息,请参阅 match_type 兼容性。

1. SELECT REGEXP_INSTR('abcabc','A',1,1,0,'');
1. +-------------------------------------+
2. | REGEXP_INSTR('abcabc','A',1,1,0,'') |
3. +-------------------------------------+
4. |                                   0 |
5. +-------------------------------------+
6. 1 row in set (0.00 sec)
1. SELECT REGEXP_INSTR('abcabc','A',1,1,0,'i');
1. +--------------------------------------+
2. | REGEXP_INSTR('abcabc','A',1,1,0,'i') |
3. +--------------------------------------+
4. |                                    1 |
5. +--------------------------------------+
6. 1 row in set (0.00 sec)

除了 match_type,排序规则 也会影响匹配。在下面的示例中,使用了区分大

(本文超出站点单文档体积上限,已截断)