字符串函数主要用来处理数据库中的字符串数据,MySQL中字符串函数有:计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。
mysql> SELECT CHAR_LENGTH('hello'),CHAR_LENGTH('egg');
+----------------------+--------------------+
| CHAR_LENGTH('hello') | CHAR_LENGTH('egg') |
+----------------------+--------------------+
| 5 | 3 |
+----------------------+--------------------+
1 row in set (0.00 sec)
总结:CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。
mysql> SELECT LENGTH('hello'),LENGTH('egg');
+-----------------+---------------+
| LENGTH('hello') | LENGTH('egg') |
+-----------------+---------------+
| 5 | 3 |
+-----------------+---------------+
1 row in set (0.00 sec)
总结:LENGTH(str)返回值为字符串的字节长度,使用utf8编码字符集时,一个汉字是3个字节,一个数字或者字母算一个字节。
mysql> SELECT CONCAT('My SQL','5.6'),CONCAT('My',NULL,'SQL');
+------------------------+-------------------------+
| CONCAT('My SQL','5.6') | CONCAT('My',NULL,'SQL') |
+------------------------+-------------------------+
| My SQL5.6 | NULL |
+------------------------+-------------------------+
1 row in set (0.05 sec)
总结:
a.CONCAT(s1,s2,…)返回结果为连接参数产生的字符串,一个或多个参数。
b.有任何一个参数为NULL,则返回值为NULL.
c.如果所有参数均为非二进制字符串,则结果为非二进制字符串。
d.如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
mysql> SELECT CONCAT_WS('-','1st','2nd','3rd'),CONCAT_WS('*','1st',NULL,'3rd');
+----------------------------------+---------------------------------+
| CONCAT_WS('-','1st','2nd','3rd') | CONCAT_WS('*','1st',NULL,'3rd') |
+----------------------------------+---------------------------------+
| 1st-2nd-3rd | 1st*3rd |
+----------------------------------+---------------------------------+
1 row in set (0.00 sec)
总结:
a.CONCAT_WS代表CONCAT WITH Separator,是CONCAT()的特殊形式。
b.第一个参数x是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。
c.分隔符可以是一个字符串,也可以是其他参数。
d.如果分隔符为NULL,则结果为NULL。
f.函数会忽略任何分隔符参数后的NULL值。
mysql> SELECT INSERT('Quest',2,4,'What') AS col1,
-> INSERT('Quest',-1,4,'What') AS col2,
-> INSERT('Quest',3,100,'Wh') AS col3;
+-------+-------+------+
| col1 | col2 | col3 |
+-------+-------+------+
| QWhat | Quest | QuWh |
+-------+-------+------+
1 row in set (0.00 sec)
总结:
a.INSERT(s1,x,len,s2)返回字符串s1,其子字符串起始于x位置和被字符串s2取代的len字符。
b.如果x超过字符串长度,则返回值为原始字符串。
c.假如len的长度大于其他字符串的长度,则从位置x开始替换。替换s2的所有。
d.若任何一个参数为NULL,则返回值为NULL。
mysql> SELECT LOWER('BEAUTIFUL'),LCASE('Well');
+--------------------+---------------+
| LOWER('BEAUTIFUL') | LCASE('Well') |
+--------------------+---------------+
| beautiful | well |
+--------------------+---------------+
1 row in set (0.00 sec)
mysql> SELECT UPPER('black'),UCASE('BLacK');
+----------------+----------------+
| UPPER('black') | UCASE('BLacK') |
+----------------+----------------+
| BLACK | BLACK |
+----------------+----------------+
1 row in set (0.00 sec)
总结:
a.LOWER(str)或者LCASE(str)可以将字符串str中的字母字符全部转换成小写字母。
b.UPPER(str)或者UCASE(str)函数将字符串中所有字母字符转换成大写字母。
mysql> SELECT LEFT('football',5);
+--------------------+
| LEFT('football',5) |
+--------------------+
| footb |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT RIGHT('football',4);
+---------------------+
| RIGHT('football',4) |
+---------------------+
| ball |
+---------------------+
1 row in set (0.00 sec)
总结:
a.LEFT(s,n)返回字符串s开始的最左边n个字符。
b.RIGHT(s,n)返回字符串str最右边n个字符。
mysql> SELECT LPAD('hello',4,'??'),LPAD('hello',10,'??');
+----------------------+-----------------------+
| LPAD('hello',4,'??') | LPAD('hello',10,'??') |
+----------------------+-----------------------+
| hell | ?????hello |
+----------------------+-----------------------+
1 row in set (0.00 sec)
mysql> SELECT RPAD('hello',4,'?'),RPAD('hello',10,'?');
+---------------------+----------------------+
| RPAD('hello',4,'?') | RPAD('hello',10,'?') |
+---------------------+----------------------+
| hell | hello????? |
+---------------------+----------------------+
1 row in set (0.00 sec)
总结:
a.LPAD(s1,len,s2)返回字符串s1,其左边由字符串s2填补到len字符串长度。假如s1的长度大于len,则返回值被缩短至len字符。
b.PRAD(s1,len,s2)返回字符串s1,其右边被字符串s2填补至len字符长度。假如字符串s1的长度大于len,则返回值被缩短至len字符长度。
解释:
字符串“hello”长度大于4,不需要填充,因此LPAD(‘hello’,4,’??’)只返回被缩短的长度为4的字符串hell;字符串“hello”长度小于10,LPAD(‘hello’,10,’??’)返回结果为“?????hello”,左侧填充“?”,长度为10;
mysql> SELECT '( book )',CONCAT('(',LTRIM(' book '),')');
+------------+-----------------------------------+
| ( book ) | CONCAT('(',LTRIM(' book '),')') |
+------------+-----------------------------------+
| ( book ) | (book ) |
+------------+-----------------------------------+
1 row in set (0.00 sec)
mysql> SELECT '( book )',CONCAT('(',RTRIM(' book '),')');
+------------+-----------------------------------+
| ( book ) | CONCAT('(',RTRIM(' book '),')') |
+------------+-----------------------------------+
| ( book ) | ( book) |
+------------+-----------------------------------+
1 row in set (0.01 sec)
mysql> SELECT '( book )',CONCAT('(',TRIM(' book '),')');
+------------+----------------------------------+
| ( book ) | CONCAT('(',TRIM(' book '),')') |
+------------+----------------------------------+
| ( book ) | (book) |
+------------+----------------------------------+
1 row in set (0.00 sec)
总结:
a.LTRIM(s)返回字符串s,字符串左侧空格字符被删除。
b.RTRIM(s)返回字符串s,字符串右侧空格字符被删除。
c.TRIM(s) 删除字符串s两侧的空格。
d.字符串s中间的空格不删除。
mysql> SELECT TRIM('xy' FROM 'xyxksdjsxyxsdsjxxyxy');
+----------------------------------------+
| TRIM('xy' FROM 'xyxksdjsxyxsdsjxxyxy') |
+----------------------------------------+
| xksdjsxyxsdsjx |
+----------------------------------------+
1 row in set (0.09 sec)
总结:
a.TRIM(s1 FROM s2)函数删除字符串中两端指定的字符。
b.中间的字符串不删除。
mysql> SELECT REPEAT('MySQL',3);
+-------------------+
| REPEAT('MySQL',3) |
+-------------------+
| MySQLMySQLMySQL |
+-------------------+
1 row in set (0.01 sec)
总结:
a.REPEATE(s,n)返回一个有重复的字符串s组成的字符串,字符串s的数目等于n
b.若n<=0,则返回一个空字符串。
c.若s或n为NULL,则返回NULL。
mysql> SELECT CONCAT('(',SPACE(6),')');
+--------------------------+
| CONCAT('(',SPACE(6),')') |
+--------------------------+
| ( ) |
+--------------------------+
1 row in set (0.00 sec)
mysql> SELECT REPLACE('xxx.mysql.com','x','w');
+----------------------------------+
| REPLACE('xxx.mysql.com','x','w') |
+----------------------------------+
| www.mysql.com |
+----------------------------------+
1 row in set (0.00 sec)
总结:
a.SPACE(6)返回一个由n个空格组成的字符串。
b.REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1。
mysql> SELECT STRCMP('txt','txt2'),STRCMP('txt2','txt'),STRCMP('txt','txt');
+----------------------+----------------------+---------------------+
| STRCMP('txt','txt2') | STRCMP('txt2','txt') | STRCMP('txt','txt') |
+----------------------+----------------------+---------------------+
| -1 | 1 | 0 |
+----------------------+----------------------+---------------------+
1 row in set (0.02 sec)
总结:
STRCMP(s1,s2)若所有的字符串均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回-1,其他情况返回1.
mysql> SELECT SUBSTRING('breakfast',5) AS col1,
-> SUBSTRING('breakfast',5,3) AS col2,
-> SUBSTRING('lunch',-3) AS col3,
-> SUBSTRING('lunch',-5,3) AS col4;
+-------+------+------+------+
| col1 | col2 | col3 | col4 |
+-------+------+------+------+
| kfast | kfa | nch | lun |
+-------+------+------+------+
1 row in set (0.00 sec)
mysql> SELECT MID('breakfast',5) AS col1,
-> MID('breakfast',5,3) AS col2,
-> MID('lunch',-3) AS col3,
-> MID('lunch',-5,3) AS col4;
+-------+------+------+------+
| col1 | col2 | col3 | col4 |
+-------+------+------+------+
| kfast | kfa | nch | lun |
+-------+------+------+------+
1 row in set (0.00 sec)
总结:
a.SUBSTRING(s,n,len)带有len参数的格式,从字符串s返回一个长度同len字符相同的子字符串。
b.起始于位置n,也可能对n使用一个负值,若为负值,则子字符串的位置起始于字符串结尾n字符,即倒数第n个字符,二不是字符串的开头位置。
c.MID(s,n,len)与SUBSTRING(s,n,len)的作用相同。
mysql> SELECT LOCATE('ball','foatball'),POSITION('ball'IN'football'),INSTR('football','ball');
+---------------------------+------------------------------+--------------------------+
| LOCATE('ball','foatball') | POSITION('ball'IN'football') | INSTR('football','ball') |
+---------------------------+------------------------------+--------------------------+
| 5 | 5 | 5 |
+---------------------------+------------------------------+--------------------------+
1 row in set (0.00 sec)
总结:
LOCATE(str1,str2)、POSITION(str1 IN str)和INSTR(str str1)3个函数的作用相同,返回字符串str1在字符串str的开始位置。
mysql> SELECT REVERSE('abc');
+----------------+
| REVERSE('abc') |
+----------------+
| cba |
+----------------+
1 row in set (0.00 sec)
总结:
REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符串顺序相反。
mysql> SELECT ELT(3,'1str','2nd','3rd'),ELT(3,'net','os');
+---------------------------+-------------------+
| ELT(3,'1str','2nd','3rd') | ELT(3,'net','os') |
+---------------------------+-------------------+
| 3rd | NULL |
+---------------------------+-------------------+
1 row in set (0.00 sec)
总结:
ELT(N,字符串1,字符串2,字符串3,…,字符串M)若N=1,则返回字符串1,若N=2,则返回字符串2,依次类推。若N小于1或大于参数的数目,则返回NULL。
16.返回指定字符串位置的函数FIELD(s,s1,s2,…)
mysql> SELECT FIELD('Hi','hihi','Hey','Hi','bas') as col1,
-> FIELD('Hi','Hey','Lo','foo') as col1;
+------+------+
| col1 | col1 |
+------+------+
| 3 | 0 |
+------+------+
1 row in set (0.00 sec)
总结:
FIELD(s,s1,s2,…)返回字符串s在列表s1,s2,…中第一次出现的位置,在找不到s的情况下,返回值为0.如果s为NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。
mysql> SELECT FIND_IN_SET('Hi','hihi,Hey,Hi,bas');
+-------------------------------------+
| FIND_IN_SET('Hi','hihi,Hey,Hi,bas') |
+-------------------------------------+
| 3 |
+-------------------------------------+
1 row in set (0.00 sec)
总结:
a.FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号‘,’分开的字符串组成的列表。
b.如果s1不在s2或s2为空字符串,则返回值为0.
c.如果任意一个参数为NULL,则返回值为NULL。
d.这个函数在第一个参数包含一个逗号‘,’时将无法正常运行。
mysql> SELECT MAKE_SET(1,'a','b','c') as col1,
-> MAKE_SET(1|4,'hello','nice','world') as col2,
-> MAKE_SET(1|4,'hello','nice',NULL,'world') as col3,
-> MAKE_SET(0,'a','b','c') as col4;
+------+-------------+-------+------+
| col1 | col2 | col3 | col4 |
+------+-------------+-------+------+
| a | hello,world | hello | |
+------+-------------+-------+------+
1 row in set (0.00 sec)
总结:
MAKE_SET(x,s1,s2,…)返回由x的二进制数指定的相应位的字符串组成的字符串,s1对应比特1,s2对应比特01以此类推。s1,s2…中的NULL值不会添加到结果中。
解释:
1的二进制为0001,4的二进制为0100,1与4进行或操作之后的二进制为0101,从右到左第1位和第3位为1。