MySQL 字符串函数和运算符–全篇

MySQL 字符串函数和运算符

[TOC]

1、ASCII(str)

返回字符串最左边字符的ASCII数值,如果str为空字符串则返回0, 如果str为NULL串则返回NULL ,ASCII()适用于 8 位字符。

mysql> SELECT ASCII('');
+-----------+
| ASCII('') |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT ASCII(NULL);
+-------------+
| ASCII(NULL) |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT ASCII('abc');
+--------------+
| ASCII('abc') |
+--------------+
|           97 |
+--------------+
1 row in set (0.00 sec)

mysql> SELECT ASCII('Abc');
+--------------+
| ASCII('Abc') |
+--------------+
|           65 |
+--------------+
1 row in set (0.00 sec)

2、BIN(N)

当N的值在在bigint范围内的时候,返回这个数字的二进制,如果N等于null,那么返回null。

mysql> select bin(100);
+----------+
| bin(100) |
+----------+
| 1100100  |
+----------+
1 row in set (0.00 sec)

2^6+2^5+2^2=64+32+4=100

mysql> select bin(null);
+-----------+
| bin(null) |
+-----------+
| NULL      |
+-----------+
1 row in set (0.00 sec)

3、BIT_LENGTH(str)

返回字符串的长度( 以bit为单位)。如果str为空字符串则返回0,如果str是 null则返回 NULL。(1字节=8bit)

mysql> SELECT BIT_LENGTH('abcd');
+--------------------+
| BIT_LENGTH('abcd') |
+--------------------+
|                 32 |
+--------------------+
1 row in set (0.00 sec)

4*8=32

mysql> SELECT BIT_LENGTH('');
+----------------+
| BIT_LENGTH('') |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT BIT_LENGTH(null);
+------------------+
| BIT_LENGTH(null) |
+------------------+
|             NULL |
+------------------+
1 row in set (0.00 sec)

4、CHAR(N,… [USING charset_name])

char函数比较复杂,默认不加USING参数是返回整数N对应的16进制值,

mysql> select char(77);
+--------------------+
| char(77)           |
+--------------------+
| 0x4D               |
+--------------------+
1 row in set (0.00 sec)

4 * 16^1+ D * 16^0=64+13=77

如果使用USING参数,则返回这个ASCII值

mysql> SELECT CHAR(88 USING utf8mb4);
+------------------------+
| CHAR(88 USING utf8mb4) |
+------------------------+
| X                      |
+------------------------+
1 row in set (0.00 sec)

mysql> select ascii('X');
+------------+
| ascii('X') |
+------------+
|         88 |
+------------+
1 row in set (0.00 sec)

其他情况,如果是null则返回null,如果是0则返回0x00

mysql> SELECT CHAR(null);
+------------------------+
| CHAR(null)             |
+------------------------+
| 0x                     |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT CHAR(0);
+------------------+
| CHAR(0)          |
+------------------+
| 0x00             |
+------------------+
1 row in set (0.00 sec)

5、CHAR_LENGTH(str)

LENGTH返回的是字节长度,一个汉字等于3个字节,一个字母等于1个字节,空格也算

CHAR_LENGTH返回的是字符长度,一个汉字和一个字母都是1个字符长度,空格也算

mysql> SET @dolphin:='海豚';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin);
+------------------+-----------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) |
+------------------+-----------------------+
|                6 |                     2 |
+------------------+-----------------------+
1 row in set (0.00 sec)

mysql> SET @dolphin:='abc';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin);
+------------------+-----------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) |
+------------------+-----------------------+
|                3 |                     3 |
+------------------+-----------------------+
1 row in set (0.00 sec)

6、CHARACTER_LENGTH(str)

CHARACTER_LENGTH(str) 是CHAR_LENGTH(str)的同义词,两者一样

mysql> SET @dolphin:='海豚';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin), CHARACTER_LENGTH(@dolphin);
+------------------+-----------------------+----------------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) | CHARACTER_LENGTH(@dolphin) |
+------------------+-----------------------+----------------------------+
|                6 |                     2 |                          2 |
+------------------+-----------------------+----------------------------+
1 row in set (0.00 sec)

mysql> SET @dolphin:='abc';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin), CHARACTER_LENGTH(@dolphin);
+------------------+-----------------------+----------------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) | CHARACTER_LENGTH(@dolphin) |
+------------------+-----------------------+----------------------------+
|                3 |                     3 |                          3 |
+------------------+-----------------------+----------------------------+
1 row in set (0.00 sec)

7、CONCAT(str1,str2,…)

连接多个字符串,有null,则返回null

mysql> SELECT CONCAT('My', null, 'QL');
+--------------------------+
| CONCAT('My', null, 'QL') |
+--------------------------+
| NULL                     |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT('My', 'S', 'QL');
+-------------------------+
| CONCAT('My', 'S', 'QL') |
+-------------------------+
| MySQL                   |
+-------------------------+
1 row in set (0.00 sec)

8、CONCAT_WS(separator,str1,str2,…)

用什么把字符串连接起来,这里separator等于’null’和null是两种情况

mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
+----------------------------------------------+
| CONCAT_WS(',','First name',NULL,'Last Name') |
+----------------------------------------------+
| First name,Last Name                         |
+----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT_WS('null','First name',NULL,'Last Name');
+-------------------------------------------------+
| CONCAT_WS('null','First name',NULL,'Last Name') |
+-------------------------------------------------+
| First namenullLast Name                         |
+-------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT_WS(null,'First name',NULL,'Last Name');
+-----------------------------------------------+
| CONCAT_WS(null,'First name',NULL,'Last Name') |
+-----------------------------------------------+
| NULL                                          |
+-----------------------------------------------+
1 row in set (0.00 sec)

9、ELT(N,str1,str2,str3,…)

返回第N个字符串,如果N为null,则返回null

mysql> SELECT ELT(1, 'Aa', 'Bb', 'Cc', 'Dd');
+--------------------------------+
| ELT(1, 'Aa', 'Bb', 'Cc', 'Dd') |
+--------------------------------+
| Aa                             |
+--------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ELT(3, 'Aa', 'Bb', 'Cc', 'Dd');
+--------------------------------+
| ELT(3, 'Aa', 'Bb', 'Cc', 'Dd') |
+--------------------------------+
| Cc                             |
+--------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ELT(null, 'Aa', 'Bb', 'Cc', 'Dd');
+-----------------------------------+
| ELT(null, 'Aa', 'Bb', 'Cc', 'Dd') |
+-----------------------------------+
| NULL                              |
+-----------------------------------+
1 row in set (0.00 sec)

如果N是小数,则四舍五入

mysql> SELECT ELT(1.4, 'Aa', 'Bb', 'Cc', 'Dd');
+----------------------------------+
| ELT(1.4, 'Aa', 'Bb', 'Cc', 'Dd') |
+----------------------------------+
| Aa                               |
+----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ELT(1.8, 'Aa', 'Bb', 'Cc', 'Dd');
+----------------------------------+
| ELT(1.8, 'Aa', 'Bb', 'Cc', 'Dd') |
+----------------------------------+
| Bb                               |
+----------------------------------+
1 row in set (0.00 sec)

10、EXPORT_SET(bits,on,off[,separator[,number_of_bits]])

今日最难!

首先简化函数为EXPORT_SET(bits, on, off, separator, length)

参数解释: bits:必需的。一个数字。将 bits 转为二进制并反转后的各个位的值决定 on 还是 off 出现在该位置。 on:必需的。当位值为 1 时使用的字符串。 off:必需的。当位值为 0 时使用的字符串。 separator:可选的。分隔符或者分隔字符串,默认值为 ,。 length:可选的。集合的元素的个数,默认值为 64。

返回值 EXPORT_SET() 函数根据 bits 对应的二进制并反转后的值挑选对应的字符串,并返回一个逗号分隔的字符串集合。

比如

mysql> SELECT EXPORT_SET(12,'A','B','-',20);
+-----------------------------------------+
| EXPORT_SET(12,'A','B','-',20)           |
+-----------------------------------------+
| B-B-A-A-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-|
+-----------------------------------------+
1 row in set (0.00 sec)

bits = 12, 12的二进制位 1100, 总长度为 4,所以不用补0(如果不足4位的,需要左边补 0)。然后反转变为 0011。

按 0011中的每位的值使用 on 或者 off:

第一位为 0,则使用 B。 第二位为 0,则使用 B。 第三位为 1,则使用 A。 第四位为 1,则使用 A。 最后将所有的字符串使用分隔符 – 组合起来,即:B-B-A-A。

length长度为20,则0011补位为0011 0000 0000 0000 0000,替换on和off。则为

BBAA BBBB BBBB BBBB BBBB

再用-符号连接,则为

B-B-A-A-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B

11、FIELD(str,str1,str2,str3,…)

返回str在str1,str2,str3,…中的位置数,如果没有就返回0,如果str等于null,也返回0。如果有多个匹配值,只返回第一个值的位置数

mysql> SELECT FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
+-------------------------------------------+
| FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff') |
+-------------------------------------------+
|                                         2 |
+-------------------------------------------+
1 row in set (0.01 sec)

mysql> SELECT FIELD('Bc', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
+-------------------------------------------+
| FIELD('Bc', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff') |
+-------------------------------------------+
|                                         0 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff', 'Bb');
+-------------------------------------------------+
| FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff', 'Bb') |
+-------------------------------------------------+
|                                               2 |
+-------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FIELD(null, 'Aa', 'Bb', 'Cc', 'Dd', 'Ff', 'Bb');
+-------------------------------------------------+
| FIELD(null, 'Aa', 'Bb', 'Cc', 'Dd', 'Ff', 'Bb') |
+-------------------------------------------------+
|                                               0 |
+-------------------------------------------------+
1 row in set (0.00 sec)

12、FIND_IN_SET(str,strlist)

返回str位置数在strlist中的位置数,strlist的格式为一个字符串集合(set)

mysql> SELECT FIND_IN_SET('bc','a,bc,c,d,e,f');
+----------------------------------+
| FIND_IN_SET('bc','a,bc,c,d,e,f') |
+----------------------------------+
|                                2 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FIND_IN_SET('bc','a,b,c,c,d,e,f');
+-----------------------------------+
| FIND_IN_SET('bc','a,b,c,c,d,e,f') |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FIND_IN_SET('bc','abcd');
+--------------------------+
| FIND_IN_SET('bc','abcd') |
+--------------------------+
|                        0 |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT FIND_IN_SET('bc','abcd,bc');
+-----------------------------+
| FIND_IN_SET('bc','abcd,bc') |
+-----------------------------+
|                           2 |
+-----------------------------+
1 row in set (0.00 sec)

13、FORMAT(X,D[,locale])

格式化X的格式为’#,###,###.##’,D代表小数位,如果X或者D等于null,则返回null,D也可以为小数,但是要四舍五入。

其中locale默认为en_US,我们常用zh_CN

mysql> SELECT FORMAT(12332.123456, 4);
+-------------------------+
| FORMAT(12332.123456, 4) |
+-------------------------+
| 12,332.1235             |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT FORMAT(12332.123456, 4.4);
+---------------------------+
| FORMAT(12332.123456, 4.4) |
+---------------------------+
| 12,332.1235               |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT FORMAT(12332.123456, 4.8);
+---------------------------+
| FORMAT(12332.123456, 4.8) |
+---------------------------+
| 12,332.12346              |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT FORMAT(12332.123456, 4.8, 'zh_CN');
+------------------------------------+
| FORMAT(12332.123456, 4.8, 'zh_CN') |
+------------------------------------+
| 12,332.12346                       |
+------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FORMAT(12332.123456, 4.8, 'en_US');
+------------------------------------+
| FORMAT(12332.123456, 4.8, 'en_US') |
+------------------------------------+
| 12,332.12346                       |
+------------------------------------+
1 row in set (0.00 sec)

14、FROM_BASE64(str)

将BASE64编发返回成字符串,与TO_BASE64(str)相反

需要在客户端使用–binary-as-hex=0,否则返回的是16进制

mysql> SELECT FROM_BASE64('TXlTUUw=');
+--------------------------------------------------+
| FROM_BASE64('TXlTUUw=')                          |
+--------------------------------------------------+
| 0x4D7953514C                                     |
+--------------------------------------------------+
1 row in set (0.00 sec)


[root@mydb01 ~]# mysql --binary-as-hex=0

mysql> SELECT FROM_BASE64('TXlTUUw=');
+-------------------------+
| FROM_BASE64('TXlTUUw=') |
+-------------------------+
| MySQL                   |
+-------------------------+
1 row in set (0.00 sec)

15、HEX(str), HEX(N)

把字符串和数字转换成16进制,字符串的逆向函数是 UNHEX(),数字的逆向函数是 CONV(HEX(N),16,10),函数HEX(N)等于CONV(N,10,16)。同样受–binary-as-hex参数的影响

mysql> select hex(88);
+---------+
| hex(88) |
+---------+
| 58      |
+---------+
1 row in set (0.00 sec)

mysql> select CONV(88,10,16) ;
+----------------+
| CONV(88,10,16) |
+----------------+
| 58             |
+----------------+
1 row in set (0.00 sec)

mysql> select CONV(HEX(88),16,10);
+---------------------+
| CONV(HEX(88),16,10) |
+---------------------+
| 88                  |
+---------------------+
1 row in set (0.00 sec)

5 8
0 8

mysql> select hex('MySQL');
+--------------+
| hex('MySQL') |
+--------------+
| 4D7953514C   |
+--------------+
1 row in set (0.00 sec)

mysql> select unhex('4D7953514C');
+------------------------------------------+
| unhex('4D7953514C')                      |
+------------------------------------------+
| 0x4D7953514C                             |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> q
Bye
[root@mydb01 ~]# mysql --binary-as-hex=0
mysql> select unhex('4D7953514C');
+---------------------+
| unhex('4D7953514C') |
+---------------------+
| MySQL               |
+---------------------+
1 row in set (0.00 sec)

16、INSERT(str,pos,len,newstr)

str:需要处理的字符串。 pos:开始插入新字符串 newstr 的位置。pos 的值从 1 开始。 len:要被替换的字符的数量。 newstr: 要插入的新字符串。

简单来说就是把newstr插入str,从pos开始,替换len个字符,如果有参数为null,则全部为null

mysql> SELECT INSERT('abcdefg', 3, 3, 'What');
+---------------------------------+
| INSERT('abcdefg', 3, 3, 'What') |
+---------------------------------+
| abWhatfg                        |
+---------------------------------+
1 row in set (0.00 sec)

17、INSTR(str,substr)

返回substr在str中第一次出现的位置,没有则返回0

mysql> select instr('abcdabcd','bc');
+------------------------+
| instr('abcdabcd','bc') |
+------------------------+
|                      2 |
+------------------------+
1 row in set (0.00 sec)

mysql> select instr('abcdabcd','bce');
+-------------------------+
| instr('abcdabcd','bce') |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

18、LCASE(str)

LCASE() 是 LOWER()的同义词,把字符串转换成小写

mysql> select lcase('AbC'),lower('aBc');
+--------------+--------------+
| lcase('AbC') | lower('aBc') |
+--------------+--------------+
| abc          | abc          |
+--------------+--------------+
1 row in set (0.00 sec)

19、LEFT(str,len)

返回str中从左边开始的len长度的字符串,参数为null则返回null

mysql> select left('abcdefg',3);
+-------------------+
| left('abcdefg',3) |
+-------------------+
| abc               |
+-------------------+
1 row in set (0.00 sec)

20、LENGTH(str)

LENGTH(string) 函数返回指定字符串的以字节为单位的长度,即字节的数量。当参数为 NULL 时, LENGTH() 函数将返回 NULL。

mysql> SELECT LENGTH('Hello'),LENGTH(''),LENGTH(20),LENGTH(-20),LENGTH(+20),LENGTH(NOW()),LENGTH(CURDATE()),LENGTH('你好'),LENGTH(NULL)G
*************************** 1. row ***************************
  LENGTH('Hello'): 5
       LENGTH(''): 0
       LENGTH(20): 2
      LENGTH(-20): 3
      LENGTH(+20): 2
    LENGTH(NOW()): 19
LENGTH(CURDATE()): 10
 LENGTH('你好'): 6
     LENGTH(NULL): NULL

21、LOCATE(substr,str), LOCATE(substr,str,pos)

substr: 在 str 中搜索的子串。 str: 被搜索的字符串。 startPos:在 str 中开始搜索的位置,从 1 开始。

返回第一次出现的位置

mysql> select locate('cd','abcdefgcdefgh') ;
+------------------------------+
| locate('cd','abcdefgcdefgh') |
+------------------------------+
|                            3 |
+------------------------------+
1 row in set (0.00 sec)

mysql> select locate('cd','abcdefgcdefgh',5) ;
+--------------------------------+
| locate('cd','abcdefgcdefgh',5) |
+--------------------------------+
|                              8 |
+--------------------------------+
1 row in set (0.00 sec)

22、LOWER(str)

LCASE() 是 LOWER()的同义词,把字符串转换成小写

23、LPAD(str,len,padstr)

MySQL LPAD() 函数在字符串的左侧填充指定的字符串,使其达到指定的长度。如果想在字符串的右侧填充字符串,请使用 RPAD() 函数。

str:需要被填充的字符串。 len:填充字符串需要达到的长度。 padstr:被用来填充到原字符串左侧的字符串。

LPAD() 函数在字符串的左侧填充指定的字符串,使其达到指定的长度,并返回填充后的字符串。

如果 len 小于原字符串 str 的长度, str 将被截断到 len 的长度。 如果 len 为负数时,LPAD() 函数将返回 NULL。 当任意一个参数为 NULL 时, LPAD() 函数将返回 NULL。

mysql> SELECT LPAD('oh', 10, 'o'),LPAD('oh', 1, 'o'),LPAD('oh', -1, 'o'),LPAD('World', 13, 'Hello')G
*************************** 1. row ***************************
       LPAD('oh', 10, 'o'): oooooooooh
        LPAD('oh', 1, 'o'): o
       LPAD('oh', -1, 'o'): NULL
LPAD('World', 13, 'Hello'): HelloHelWorld
1 row in set (0.00 sec)

24、LTRIM(str)

MySQL LTRIM() 函数删除指定字符串的前导空格,并返回没有前导空格的字符串。如果删除字符串的尾随空格,请使用 RTRIM() 函数;如果想同时删除字符串的前导和尾随空格,请使用 TRIM() 函数

mysql> SELECT LTRIM('   abcd '),LTRIM(NULL);
+-------------------+-------------+
| LTRIM('   abcd ') | LTRIM(NULL) |
+-------------------+-------------+
| abcd              | NULL        |
+-------------------+-------------+
1 row in set (0.00 sec)

25、MAKE_SET(bits,str1,str2,…)

MAKE_SET() 函数返回一个逗号分隔的字符串集合,该函数通过第一个参数对应的二进制决定是否其他字符串参数是否添加到结果集合中。

bits:一个数字。将 bits 转为二进制并反转后的各个位决定 str1, str2, … 是否出现在结果中。

参数 str1, str2, … 中的 NULL 不会出现结果中。

比如 bits = 6, 6 对应的二进制是 110, 110 反转后 011,那么 MAKE_SET() 函数返回的结果是 str2,str3。

如果 bits 为 0, MAKE_SET() 函数将返回空串。

mysql> SELECT MAKE_SET(5, 'ab', 'cd', 'ef', 'gh');
+-------------------------------------+
| MAKE_SET(5, 'ab', 'cd', 'ef', 'gh') |
+-------------------------------------+
| ab,ef                               |
+-------------------------------------+
1 row in set (0.01 sec)

5对应的二进制是101,反转之后还是101,所以第1和3位置的字符串输出为ab,ef

26、MID(str,pos,len)

MID(str,pos,len)是SUBSTRING(str,pos,len)的同义词,返回一个字符串中从指定位置开始的指定长度的子字符串,从pos位置开始,提取len个字符串

mysql> select mid('mysql',3,3);
+------------------+
| mid('mysql',3,3) |
+------------------+
| sql              |
+------------------+

27、OCT(N)

返回给定数字的八进制值的字符串,如果参数 number 为非数字类型,OCT() 函数会首先尝试将其转为数字后再返回数字的八进制表示。 如果参数 number 为 NULL,OCT() 函数将返回 NULL。

mysql> select oct(25);
+---------+
| oct(25) |
+---------+
| 31      |
+---------+
1 row in set (0.00 sec)

28、OCTET_LENGTH(str)

OCTET_LENGTH() 是 LENGTH()的同义词.返回字符长度

mysql> select OCTET_LENGTH('abcde'),LENGTH('ABCDE'), OCTET_LENGTH('数据库');
+-----------------------+-----------------+---------------------------+
| OCTET_LENGTH('abcde') | LENGTH('ABCDE') | OCTET_LENGTH('数据库')    |
+-----------------------+-----------------+---------------------------+
|                     5 |               5 |                         9 |
+-----------------------+-----------------+---------------------------+
1 row in set (0.00 sec)

29、ORD(str)

返回字符串参数中的第一个字符的字符代码。如果第一个字符是单字节字符, ORD() 函数返回字符的 ASCII 值;如果第一个字符是多字节字符,返回公式 第一个字节代码 + 第二个字节的代码 * 256 + 第三个字节的代码 * 256 * 256 的结果。如果str为null,则返回null

mysql> SELECT ORD('ABC');
+------------+
| ORD('ABC') |
+------------+
|         65 |
+------------+
1 row in set (0.00 sec)

30、POSITION(substr IN str)

POSITION(substr IN str)是LOCATE(substr,str)的同义词,返回一个字符串在另一个字符串中第一次出现的位置的数字索引。 POSITION() 函数是不区分大小写的。 POSITION() 函数与具有两个参数的 INSTR() 函数和 LOCATE() 函数 功能相同。

mysql> select position('sql' in 'mysql');
+----------------------------+
| position('sql' in 'mysql') |
+----------------------------+
|                          3 |
+----------------------------+
1 row in set (0.00 sec)

31、QUOTE(str)

返回一个用单引号包围的字符串。 QUOTE() 函数会对 , ‘ 符号转义。如果参数是 NULL,则返回值是单词 “ NULL ”,不包含单引号。

[root@mydb01 ~]# mysql --binary-as-hex=0

mysql> SELECT QUOTE('my''sql'),QUOTE('mysql'),QUOTE('NULL')G
*************************** 1. row ***************************
QUOTE('my''sql'): 'my'sql'
 QUOTE('
mysql'): 'mysql'
   QUOTE('
NULL'): 'NULL'
1 row in set (0.00 sec)

32、REPEAT(str,count)

将指定的字符串重复指定的次数并返回,如果str等于null,则返回null

mysql> select repeat('mysql',3);
+-------------------+
| repeat('mysql',3) |
+-------------------+
| mysqlmysqlmysql   |
+-------------------+
1 row in set (0.00 sec)

33、REPLACE(str,from_str,to_str)

将字符串中出现的所有子字符串替换为新的子字符串。 REPLACE() 函数是基于字符的替换,并且替换字符串时是区分大小写的。返回 str 中的所有 from_str 被 to_str 替换后的字符串,当任意一个参数为 NULL 时, REPLACE() 函数将返回 NULL。

str:原字符串。 from_str: 被替换的子字符串。 to_str: 用来替换的新子字符串。

mysql> select replace('MySQL','My','Oracle');
+--------------------------------+
| replace('MySQL','My','Oracle') |
+--------------------------------+
| OracleSQL                      |
+--------------------------------+
1 row in set (0.00 sec)

34、REVERSE(str)

字符串反转,如果str等于null,则返回null

mysql> select reverse('123456');
+-------------------+
| reverse('123456') |
+-------------------+
| 654321            |
+-------------------+
1 row in set (0.00 sec)

35、RIGHT(str,len)

返回字符串str中最右边的len ,如果有任何参数为null,则返回null。

mysql> select right('mysql',3);
+------------------+
| right('mysql',3) |
+------------------+
| sql              |
+------------------+
1 row in set (0.00 sec)

36、RPAD(str,len,padstr)

原理同LPAD函数,RPAD填充的是右边

mysql> select rpad('my',5,'sql'),lpad('my',5,'sql');
+--------------------+--------------------+
| rpad('my',5,'sql') | lpad('my',5,'sql') |
+--------------------+--------------------+
| mysql              | sqlmy              |
+--------------------+--------------------+
1 row in set (0.00 sec)

37、RTRIM(str)

删除指定字符串的尾部空格,并返回没有尾部空格的字符串。如果删除字符串的尾随空格,请使用 RTRIM() 函数;如果想同时删除字符串的前导和尾随空格,请使用 TRIM() 函数。当参数为 NULL 时, RTRIM() 函数将返回 NULL。

mysql> select rtrim('mysql   ');
+-------------------+
| rtrim('mysql   ') |
+-------------------+
| mysql             |
+-------------------+
1 row in set (0.00 sec)

mysql> select rtrim('mysql   m');
+--------------------+
| rtrim('mysql   m') |
+--------------------+
| mysql   m          |
+--------------------+
1 row in set (0.00 sec)

38、SOUNDEX(str)

目前实现的此函数旨在与仅英语语言的字符串配合良好,返回表示字符串发音的 soundex 字符串。 SOUNDEX() 函数用来比较两个单词的发音是否相同。如果两个单词发音相同,则他们的 soundex 字符串是相同的。

标准的 soundex 字符串的长度为四个字符,但 SOUNDEX() 函数返回的字符串长度可能超过 4。如果您想获取标准的 soundex 字符串,您可以对 SOUNDEX() 函数的结果使用 SUBSTRING() 函数进行截取。

mysql> select soundex('mysql');
+------------------+
| soundex('mysql') |
+------------------+
| M240             |
+------------------+
1 row in set (0.00 sec)

mysql> select soundex('MySQL');
+------------------+
| soundex('MySQL') |
+------------------+
| M240             |
+------------------+
1 row in set (0.00 sec)

39、expr1 SOUNDS LIKE expr2

等同于 SOUNDEX(expr1) = SOUNDEX(expr2).

mysql> select 'mysql' sounds like 'oracle';
+------------------------------+
| 'mysql' sounds like 'oracle' |
+------------------------------+
|                            0 |
+------------------------------+
1 row in set (0.00 sec)

mysql> select 'mysql' sounds like 'mysql';
+-----------------------------+
| 'mysql' sounds like 'mysql' |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row in set (0.00 sec)

40、SPACE(N)

返回一个字符串,它由指定数量的空格符组成。当参数 count 小于 1 时, SPACE() 函数返回一个空字符串 ”。当参数为 NULL 时, SPACE() 函数将返回 NULL。

注意,这里为了更直观的比较结果,使用了 LENGTH() 函数返回了字符串的长度。

mysql> select space(1),length(space(1)),space(6),length(space(6));
+----------+------------------+----------+------------------+
| space(1) | length(space(1)) | space(6) | length(space(6)) |
+----------+------------------+----------+------------------+
|          |                1 |          |                6 |
+----------+------------------+----------+------------------+
1 row in set (0.00 sec)

41、SUBSTR(str,pos)

SUBSTR() 是SUBSTRING()的同义词,SUBSTR() 函数有 4 种形式的语法:

SUBSTR(str, pos) SUBSTR(str FROM pos) SUBSTR(str, pos, len) SUBSTR(str FROM pos FOR len)

从一个字符串中返回一个从指定位置开始的指定长度的子字符串。MID(str, pos, len) 等同于 SUBSTR(str, pos, len) 函数

mysql> select substr('abcdefg',3),substr('abcdefg',3,2),substr('abcdefg' from 3),substr('abcdefg' from 3 for 2);
+---------------------+-----------------------+--------------------------+--------------------------------+
| substr('abcdefg',3) | substr('abcdefg',3,2) | substr('abcdefg' from 3) | substr('abcdefg' from 3 for 2) |
+---------------------+-----------------------+--------------------------+--------------------------------+
| cdefg               | cd                    | cdefg                    | cd                             |
+---------------------+-----------------------+--------------------------+--------------------------------+
1 row in set (0.00 sec)

42、substring

substring的四种用法SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)

mysql> select substring('abcdefg',3),substring('abcdefg',3,2),substring('abcdefg' from 3),substring('abcdefg' from 3 for 2);
+------------------------+--------------------------+-----------------------------+-----------------------------------+
| substring('abcdefg',3) | substring('abcdefg',3,2) | substring('abcdefg' from 3) | substring('abcdefg' from 3 for 2) |
+------------------------+--------------------------+-----------------------------+-----------------------------------+
| cdefg                  | cd                       | cdefg                       | cd                                |
+------------------------+--------------------------+-----------------------------+-----------------------------------+
1 row in set (0.00 sec)

43、SUBSTRING_INDEX(str,delim,count)

返回一个字符串中指定分隔符出现在指定次数之前的子字符串。如果任意一个参数为 NULL 时, SUBSTRING_INDEX() 函数将返回 NULL

mysql> select substring_index('a-b-c-d-e-f','-',3);
+--------------------------------------+
| substring_index('a-b-c-d-e-f','-',3) |
+--------------------------------------+
| a-b-c                                |
+--------------------------------------+
1 row in set (0.00 sec)

44、TO_BASE64(str)

将字符串参数转换为 base-64 编码形式,并将结果作为具有连接字符集和排序规则的字符串返回.

[root@mydb01 ~]# mysql --binary-as-hex=0

mysql> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
+------------------+-------------------------------+
| TO_BASE64('abc') | FROM_BASE64(TO_BASE64('abc')) |
+------------------+-------------------------------+
| YWJj             | abc                           |
+------------------+-------------------------------+
1 row in set (0.00 sec)

45、TRIM

TRIM的用法如下:

TRIM(str) TRIM(remove_str FROM str) TRIM({BOTH | LEADING | TRAILING} remove_str FROM str)

从指定字符串的开头和结尾删除由指定字符组成的最长字符串。如果只想删除字符串的前导空格,请使用 LTRIM() 函数;如果只想删除字符串的尾随空格,请使用 RTRIM() 函数。

BOTH 代表同时删除前导和尾随的字符 LEADING 代表只删除前导字符 TRAILING 代表只删除尾随的字符 如果不指定 {BOTH | LEADING | TRAILING},则默认值为 BOTH。

remove_str 可选的。需要删除的前缀和后缀字符串。如果不指定这个 remove_str,则默认值为空格

mysql> select trim('   abc   '),trim('a' from '   abc   '),length(trim(leading from '   abc   ')),length(trim(trailing from '   abc   '));
+-------------------+----------------------------+----------------------------------------+-----------------------------------------+
| trim('   abc   ') | trim('a' from '   abc   ') | length(trim(leading from '   abc   ')) | length(trim(trailing from '   abc   ')) |
+-------------------+----------------------------+----------------------------------------+-----------------------------------------+
| abc               |    abc                     |                                      6 |                                       6 |
+-------------------+----------------------------+----------------------------------------+-----------------------------------------+
1 row in set (0.00 sec)

46、UCASE(str)

UCASE()是 UPPER()的同义词。把str变成大写.

mysql> select ucase('Abc'),upper('aBc');
+--------------+--------------+
| ucase('Abc') | upper('aBc') |
+--------------+--------------+
| ABC          | ABC          |
+--------------+--------------+
1 row in set (0.00 sec)

47、UNHEX(str)

将代表十六进制数值的字符串转换为字节,并返回对应的二进制字符串。

UNHEX() 函数的处理过程为从十六进制数值的字符串参数中每两位转换为字节,并将所有的字节组合起来作为二进制字符串返回。

UNHEX() 函数是 HEX() 函数的逆向操作。

[root@mydb01 ~]# mysql --binary-as-hex=0

mysql> select hex('mysql');
+--------------+
| hex('mysql') |
+--------------+
| 6D7973716C   |
+--------------+
1 row in set (0.00 sec)

mysql> select unhex('6D7973716C');
+---------------------+
| unhex('6D7973716C') |
+---------------------+
| mysql               |
+---------------------+
1 row in set (0.00 sec)

48、UPPER(str)

将str返回为大写,如果str为null则返回null。默认字符集是utf8mb4.

mysql> select ucase('Abc'),upper('aBc');
+--------------+--------------+
| ucase('Abc') | upper('aBc') |
+--------------+--------------+
| ABC          | ABC          |
+--------------+--------------+
1 row in set (0.00 sec)

49、WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])

WEIGHT_STRING()是供内部使用的调试功能。它可用于测试和调试排序规则,特别是在添加新排序规则时。[flags]参数未启用

此函数返回输入字符串的权重字符串。返回值是一个二进制字符串,表示字符串的比较和排序值,有参数未null则返回null

官网案例:

mysql> SET NAMES 'latin1';
mysql> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
+-------------------------------------+
| HEX(WEIGHT_STRING('ab' AS CHAR(4))) |
+-------------------------------------+
| 41422020                            |
+-------------------------------------+
mysql> SET NAMES 'utf8mb4';
mysql> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
+-------------------------------------+
| HEX(WEIGHT_STRING('ab' AS CHAR(4))) |
+-------------------------------------+
| 1C471C60                            |
+-------------------------------------+

50、LOAD_FILE(file_name)

读取文件并将文件内容作为字符串返回,需要和load data分开,这是不同的。并且列只能是blob类型,也受–binary-as-hex的影响

案例

[root@mydb01 ~]# mysql --binary-as-hex=0 db01

mysql> SHOW VARIABLES LIKE 'secure_file_priv';
+------------------+------------------+
| Variable_name    | Value            |
+------------------+------------------+
| secure_file_priv | /mysql/loaddata/ |
+------------------+------------------+
1 row in set (0.00 sec)

mysql> system cat /mysql/loaddata/1.txt
1

mysql> create table tt(id blob);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into tt values(LOAD_FILE('/mysql/loaddata/1.txt'));
Query OK, 1 row affected (0.00 sec)

mysql> select * from tt;
+------+
| id   |
+------+
| 1
   |
+------+
1 row in set (0.00 sec)

mysql> q
Bye

[root@mydb01 ~]# mysql db01

mysql> select * from tt;
+------------+
| id         |
+------------+
| 0x310A     |
+------------+
1 row in set (0.00 sec)

mysql>


原文始发于微信公众号(库海无涯):MySQL 字符串函数和运算符–全篇

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/241311.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!