目录
- 前言
- 计算字符串字符数的函数
- 计算字符串长度的函数
- 合并字符串函数CONCAT(s1,s2,...)、CONCAT_WS(x,s1,s2,...)
- 替换字符串的函数INSERT(s1,x,len,s2)
- 字母大小写转换函数
- 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)
- 填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)
- 删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)
- 删除指定字符串的函数TRIM(s1 FROM s)
- 重复生成字符串的函数REPEAT(s.n)
- 空格函数SPACE(n)
- 替换函数REPLACE(s,s1,s2)
- 比较字符串大小的函数strcmp(s1,s2)
- 获取子串的函数SUBSTRING(s,b,len)和MID(s,n,len)
- 匹配子串开始位置的函数
- 字符串逆序的函数REVERSE(s)
- 返回指定位置的字符串的函数
- 返回指定字符串位置的函数FIELD(s,s1,s2,...,sn)
- 返回子串位置的函数FIND_IN_SET(s1,s2)
- 选取字符串的函数MAKE_SET(x,s1,s2,...,sn)
前言
字符串函数主要用来处理数据库中的字符串数据。mysql
中的字符串函数有计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。
计算字符串字符数的函数
CHAR_LENGTH(str)
函数计算字符串str
所包含的字符个数。一个多字节字符算作一个单字符。
mysql> select char_length('date'), char_length('yunweijia'), char_length('运维家'); +---------------------+--------------------------+--------------------------+ | char_length('date') | char_length('yunweijia') | char_length('运维家') | +---------------------+--------------------------+--------------------------+ | 4 | 9 | 3 | +---------------------+--------------------------+--------------------------+ 1 row in set (0.00 sec) mysql>
计算字符串长度的函数
LENGTH(str)
返回值为字符串的字节长度,使用utf8
编码字符集时,一个汉字是三字节,一个数字或者字母算1字节;
mysql> select length('date'), length('yunweijia'), length('运维家'); +----------------+---------------------+---------------------+ | length('date') | length('yunweijia') | length('运维家') | +----------------+---------------------+---------------------+ | 4 | 9 | 9 | +----------------+---------------------+---------------------+ 1 row in set (0.00 sec) mysql>
合并字符串函数CONCAT(s1,s2,...)、CONCAT_WS(x,s1,s2,...)
concat(s1,s2,...)
返回结果为连接参数产生的字符串,或许有一个或多个参数。
如果有一个参数为null
,则返回值为null
。
如果所有参数均为非二进制字符串,则结果为非二进制字符串。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
mysql> select concat('mysql 8.0', 'yunweijia'), concat('heihei', null, '666'); +----------------------------------+-------------------------------+ | concat('mysql 8.0', 'yunweijia') | concat('heihei', null, '666') | +----------------------------------+-------------------------------+ | mysql 8.0yunweijia | NULL | +----------------------------------+-------------------------------+ 1 row in set (0.00 sec) mysql>
concat_ws(x,s1,s2,...)
中,x
是分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。
如果分隔符是null
,则结果为null
。该函数会忽略任何分隔符后面的null
值。
mysql> select concat_ws('-', 'mysql', '8.0', 'ywj'), concat_ws('@', 'one', null, 'two'); +---------------------------------------+------------------------------------+ | concat_ws('-', 'mysql', '8.0', 'ywj') | concat_ws('@', 'one', null, 'two') | +---------------------------------------+------------------------------------+ | mysql-8.0-ywj | one@two | +---------------------------------------+------------------------------------+ 1 row in set (0.00 sec) mysql>
替换字符串的函数INSERT(s1,x,len,s2)
insert(s1,x,len,s2)
返回字符串s1
,其子字符串起始于x
位置和被字符串s2
取代的len
字符。如果x
超过字符串长度,则返回值为原始字符串。假如len
的长度大于其他字符串的长度,则从位置x
开始替换。若任何一个参数为null
,则返回值为null
。
mysql> select insert('yunweijia', 2, 3, 'aaaaaaaa') as coll, insert('yunweijia', -1, 3, 'bbbbbbbb') as coll2, insert('yunweijia', 2, 99, 'ccccccccc') as coll3; +----------------+-----------+------------+ | coll | coll2 | coll3 | +----------------+-----------+------------+ | yaaaaaaaaeijia | yunweijia | yccccccccc | +----------------+-----------+------------+ 1 row in set (0.00 sec) mysql>
第一个函数insert('yunweijia', 2, 3, 'aaaaaaaa')
将yunweijia
第二个字符开始长度为3的字符串,替换成aaaaaaaa
;
第二个函数insert('yunweijia', -1, 3, 'bbbbbbbb')
中由于-1超出了字符串长度,直接返回了原字符串;
第三个函数insert('yunweijia', 2, 99, 'ccccccccc')
中由于替换长度99,超出了字符串原本长度,所以从第二个字符开始,截取后面所有的字符,并替换为指定字符ccccccccc
。
字母大小写转换函数
大写转小写
lower(str)
或者lcase(str)
可以将字符串str
中的字母字符全部转换成小写字母。
mysql> select lower('YUNweiJIA'), lcase('YUNweiJIA'); +--------------------+--------------------+ | lower('YUNweiJIA') | lcase('YUNweiJIA') | +--------------------+--------------------+ | yunweijia | yunweijia | +--------------------+--------------------+ 1 row in set (0.00 sec) mysql>
小写转大写
upper(str)
或者ucase(str)
可以将字符串str
中的字母字符全部转换成大写字母。
mysql> select upper('yunWEIjia'), ucase('yunWEIjia'); +--------------------+--------------------+ | upper('yunWEIjia') | ucase('yunWEIjia') | +--------------------+--------------------+ | YUNWEIJIA | YUNWEIJIA | +--------------------+--------------------+ 1 row in set (0.00 sec) mysql>
获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)
left(s,n)
返回字符串s
开始的最左边的n
个字符。
mysql> select left('yunweijia', 5); +----------------------+ | left('yunweijia', 5) | +----------------------+ | yunwe | +----------------------+ 1 row in set (0.00 sec) mysql>
right(s,n)
返回字符串s
开始的最右边的n
个字符。
mysql> select right('yunweijia', 5); +-----------------------+ | right('yunweijia', 5) | +-----------------------+ | eijia | +-----------------------+ 1 row in set (0.00 sec) mysql>
填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)
lpad(s1,len,s2)
返回字符串s1
,其左边由字符串s2
填补到len
字符长度。假如s1
的长度大于len
,则返回值被缩短至len
字符。
mysql> select lpad('yunweijia', 4, '@#'), lpad('yunweijia', 20, '@#'); +----------------------------+-----------------------------+ | lpad('yunweijia', 4, '@#') | lpad('yunweijia', 20, '@#') | +----------------------------+-----------------------------+ | yunw | @#@#@#@#@#@yunweijia | +----------------------------+-----------------------------+ 1 row in set (0.00 sec) mysql>
由于字符串yunweijia
长度大于4,所以不仅不需要填充,反而需要截取至从左开始4位字符的字符串。
RPAD(s1,len,s2)
返回字符串s1
,其右边被字符串s2
填补至len
字符长度。假如字符串s1
的长度大于len
,则返回值被缩短到len
字符长度。
mysql> select rpad('yunweijia', 4, '@#'), rpad('yunweijia', 20, '@#'); +----------------------------+-----------------------------+ | rpad('yunweijia', 4, '@#') | rpad('yunweijia', 20, '@#') | +----------------------------+-----------------------------+ | yunw | yunweijia@#@#@#@#@#@ | +----------------------------+-----------------------------+ 1 row in set (0.00 sec) mysql>
由于字符串yunweijia
长度大于4,所以不仅不需要填充,反而需要截取至从左开始4位字符的字符串。
删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)
ltrim(s)
返回字符串s
,字符串左侧空格字符被删除;
mysql> select '( yunweijia )', concat('(',ltrim(' yunweijia '),')'); +-----------------+----------------------------------------+ | ( yunweijia ) | concat('(',ltrim(' yunweijia '),')') | +-----------------+----------------------------------------+ | ( yunweijia ) | (yunweijia ) | +-----------------+----------------------------------------+ 1 row in set (0.00 sec) mysql>
rtrim(s)
返回字符串s
,字符串右侧空格字符被删除;
mysql> select '( yunweijia )', concat( '(', rtrim(' yunweijia '), ')' ); +-----------------+--------------------------------------------+ | ( yunweijia ) | concat( '(', rtrim(' yunweijia '), ')' ) | +-----------------+--------------------------------------------+ | ( yunweijia ) | ( yunweijia) | +-----------------+--------------------------------------------+ 1 row in set (0.00 sec) mysql>
trim(s)
删除字符串s
两侧的空格;
mysql> select '( yunweijia )', concat( '(', trim(' yunweijia '), ')' ); +-----------------+-------------------------------------------+ | ( yunweijia ) | concat( '(', trim(' yunweijia '), ')' ) | +-----------------+-------------------------------------------+ | ( yunweijia ) | (yunweijia) | +-----------------+-------------------------------------------+ 1 row in set (0.00 sec) mysql>
删除指定字符串的函数TRIM(s1 FROM s)
trim(s1 from s)
删除字符串s
中两端所有的子字符串s1
。s1
为可选项,在未指定情况下,删除空格。
mysql> select trim('@#' from '@#@#yunwei@#jia@#@#'); +---------------------------------------+ | trim('@#' from '@#@#yunwei@#jia@#@#') | +---------------------------------------+ | yunwei@#jia | +---------------------------------------+ 1 row in set (0.00 sec) mysql>
可以看到,只删除指定字符串两边的内容,中间的内容并不会进行删除。
重复生成字符串的函数REPEAT(s.n)
repeat(s,n)
返回一个由重复字符串s
组成的字符串,字符串s
的数量等于n
;
如果n<=0
,则返回一个空字符串;
如果s
或者n
为null
,则返回null
。
mysql> select repeat('x', 10), repeat('x', 0), repeat('x', null); +-----------------+----------------+-------------------+ | repeat('x', 10) | repeat('x', 0) | repeat('x', null) | +-----------------+----------------+-------------------+ | xxxxxxxxxx | | NULL | +-----------------+----------------+-------------------+ 1 row in set (0.00 sec) mysql>
空格函数SPACE(n)
space(n)
返回一个由n
个空格组成的字符串。
mysql> select concat('(', space(10), ')'); +-----------------------------+ | concat('(', space(10), ')') | +-----------------------------+ | ( ) | +-----------------------------+ 1 row in set (0.00 sec) mysql>
替换函数REPLACE(s,s1,s2)
replace(s,s1,s2)
使用字符串s2
替代字符串s
中所有的字符串s1
;
mysql> select replace('yunweijia', 'i', '@#'); +---------------------------------+ | replace('yunweijia', 'i', '@#') | +---------------------------------+ | yunwe@#j@#a | +---------------------------------+ 1 row in set (0.00 sec) mysql>
比较字符串大小的函数strcmp(s1,s2)
strcmp(s1,s2)
:若所有的字符串均相同,则返回0;
若根据当前分类次序,第一个参数小于第二个,则返回-1;
其他情况返回1。
mysql> select strcmp('txt', 'txt'), strcmp('txt', 'txt2'), strcmp('txt2', 'txt'); +----------------------+-----------------------+-----------------------+ | strcmp('txt', 'txt') | strcmp('txt', 'txt2') | strcmp('txt2', 'txt') | +----------------------+-----------------------+-----------------------+ | 0 | -1 | 1 | +----------------------+-----------------------+-----------------------+ 1 row in set (0.00 sec) mysql>
获取子串的函数SUBSTRING(s,b,len)和MID(s,n,len)
substring(s,n,len)
带有len
参数的格式,从字符串s
返回一个长度与len
字符相同的子字符串,起始于位置n
。
也可能对n
使用一个负值。假如这样,则子字符串的位置起始于字符串结尾的n
字符,即倒数第n
个字符,而不是字符串的开头位置。
mysql> select substring('yunweijia', 5, 2) as coll, substring('yunweijia', -3) as coll1, substring('yunweijia', 3) as coss2; +------+-------+---------+ | coll | coll1 | coss2 | +------+-------+---------+ | ei | jia | nweijia | +------+-------+---------+ 1 row in set (0.00 sec) mysql>
匹配子串开始位置的函数
locate(str1,str)
、position(str1 in str)
和instr(str, str11)
三个函数的作用相同,返回子字符串str1
在字符串str
中的开始位置。
mysql> select locate('wei', 'yunweijia'), position('wei' in 'yunweijia'), instr('yunweijia', 'wei'); +----------------------------+--------------------------------+---------------------------+ | locate('wei', 'yunweijia') | position('wei' in 'yunweijia') | instr('yunweijia', 'wei') | +----------------------------+--------------------------------+---------------------------+ | 4 | 4 | 4 | +----------------------------+--------------------------------+---------------------------+ 1 row in set (0.00 sec) mysql>
字符串逆序的函数REVERSE(s)
reverse(s)
将字符串s
反转,返回的字符串的顺序和s
字符串顺序相反。
mysql> select reverse('yunweijia') as coll, reverse('123456789') as coll1; +-----------+-----------+ | coll | coll1 | +-----------+-----------+ | aijiewnuy | 987654321 | +-----------+-----------+ 1 row in set (0.00 sec) mysql>
返回指定位置的字符串的函数
elt(n, str1, str2,...,strn)
:如果n=1
,则返回值为第一个字符串str1
;
如果n=2
,则返回值为第二个字符串str2
;以此类推。
如果n<1
或者大于参数的数目,则返回值为null
。
mysql> select elt(1, 'ni1', 'wo1', 'ta') as coll, elt(3, 'ni1', 'wo1', 'ta') as coll_1, elt(0, 'ni1', 'wo1', 'ta') as coll_2, elt(4, 'ni1', 'wo1', 'ta') as coll_3; +------+--------+--------+--------+ | coll | coll_1 | coll_2 | coll_3 | +------+--------+--------+--------+ | ni1 | ta | NULL | NULL | +------+--------+--------+--------+ 1 row in set (0.00 sec) mysql>
返回指定字符串位置的函数FIELD(s,s1,s2,...,sn)
field(s,s1,s2,...,sn)
返回字符串s
在列表s1,s2,...,sn
中第一次出现的位置,如果找不到s
,则直接返回0。
如果s
为null
,则返回时是0。
mysql> select field('w', 'yun', 'yunwei', 'w', 'yunweijia') as coll, field('x', 'yun', 'yunwei', 'w', 'yunweijia') as coll_1, field(null, 'yun', 'yunwei', 'w', 'yunweijia') as coll_2; +------+--------+--------+ | coll | coll_1 | coll_2 | +------+--------+--------+ | 3 | 0 | 0 | +------+--------+--------+ 1 row in set (0.00 sec) mysql>
返回子串位置的函数FIND_IN_SET(s1,s2)
find_in_set(s1,s2)
返回字符串s1
在字符串列表s2
中出现的位置,字符串列表是一个有多个逗号分开的字符串组成的列表。
如果s1
不在s2
或s2
为空字符串,则返回值为0;
如果任意一个参数为null
,则返回值为null
。
mysql> select find_in_set('X', 'yun,xwei,Xwei,X,jia'); +-----------------------------------------+ | find_in_set('X', 'yun,xwei,Xwei,X,jia') | +-----------------------------------------+ | 4 | +-----------------------------------------+ 1 row in set (0.00 sec) mysql>
选取字符串的函数MAKE_SET(x,s1,s2,...,sn)
make_set(x,s1,s2,...,sn)
函数按x
的二进制数从s1,s2,...,sn
中选取字符串。
mysql> select make_set(5, 'a', 'b', 'c', 'd') as coll, make_set(1|4, 'a', 'b', 'c', 'd') as coll_1, make_set(1|4, 'a', 'b', null, 'c', 'd') as coll_2, make_set(0, 'a', 'b', 'c', 'd') as coll_3; +------+--------+--------+--------+ | coll | coll_1 | coll_2 | coll_3 | +------+--------+--------+--------+ | a,c | a,c | a | | +------+--------+--------+--------+ 1 row in set (0.00 sec) mysql>
5的二进制是0101
,从右往左的第1位和第3位是1,所以选取a、c
;
1的二进制是1
,4的二进制是100
,进行或操作之后的二进制是101
,从右往左的第1位和第3位是1,所以选取a、c
;
由于null
不参与计算,所以不会添加到结果中,所以coll_2
只有a
。