13.3 字符串函数
字符串函数是MySQL中最常用的一类函数。字符串函数主要用于处理表中的字符串。字符串函数包括求字符串长度、合并字符串、在字符串中插入字串和大小写字母之间的切换等函数。下面是各种字符串函数的符号、作用。
<td width="30%" rtrim(s)<="" td="">
函数 | 作用 |
---|---|
CHAR_LIGNTH(s) | 返回字符串s的字符数 |
LENGTH(s) | 返回字符串s的长度 |
CONCAT(s1,s2,...) | 将字符串s1,s2等合并成为一个字符串 |
CONCAT_WS(x,s1,s2,...) | 同CONCAT(s1,s2,...)函数,但是把每个字符串直接要加上x |
INSERT(s1,x,len,s2) | 将字符串s2替换s1的x位置开始长度为len的字符串 |
UPPER(s),UCASE(s) | 将字符串的所有字母都变成大写字母 |
LOWWER(s),LCASE(s) | 将字符串的所有字母都变成小写字母 |
LEFT(s,n) | 返回字符串的前n个字符 |
RIGHT(s,n) | 返回字符串s的后n个字符 |
LPAD(s1,len,s2) | 字符串s2来填充s1的结尾开始处,是字符串长度大道len |
RPAD(s1,len,s2) | 字符串s2来填充s1的结尾处,是字符串长度大道len |
LTRIM(s)/td> | 去掉字符串开始处的空格 |
去掉字符串结尾处的空格 | |
TRIM(s) | 去掉字符串s开始处和结尾处的空格 |
TRIM(s1 FROM s) | 去掉字符串s中开始处和结尾处的字符串s1 |
REPEAT(s,n) | 将字符串s重复n次 |
SPACE(n) | 返回n分空格 |
REPLACE(s,s1,s2) | 用字符串s2替代字符串s中的字符串s1 |
STRCMP(s1,s2) | 比较字符串s1和s2 |
SUBSTRING(s,n,len) | 获取从字符串s中的第n个位置开始长度为len的字符串 |
MID(s,n,len) | 同SUBSTRING(s,n,len) |
LOCATE(s1,s)POSITION(s1 IN s) | 从s中获取s1的开始位置 |
INSERT(s,s1) | 从s中获取s1的开始位置 |
REVERSE(s) | 将字符串s的顺序反过来 |
ELT(n,s1,s2...) | 返回第n个字符串 |
EXPORT_SET(x,s1,s2) | |
FIELD(s,s1,s2,...) | 返回第一个与字符串s匹配的字符串的位置 |
FIND_IN_SET(s1,s2) | 返回在字符串s2中与s1匹配的字符串的位置 |
MALE_SET(x,s1,s2,...) | 按x的二进制数从s1,s2,...sn中选取字符串 |
13.3.1 计算字符串字符数的函数和字符长度的函数
CHAR_LENGTH(s)函数计算字符串s的字符数,LENGTH(s)函数计算字符串s的长度。
【示例13-13】下面将演示CHAR_LENGTH(s)函数和LENGTH(s)函数的使用。
mysql>SELECT s ,CHAR_LENGTH(s),length(s) FROM t2; +-------+----------------+-----------+ | s | CHAR_LENGTH(s) | length(s) | +-------+----------------+-----------+ |beijing| 7 | 7 | +-------+----------------+-----------+ 1 row in set(0.00 sec)
结果显示,12表中s字段的值为“beijing”。该字符串包含7个字符,长度为7。
说明:字符串“beijing”共有7个字符,但是占用的空间是8个字节。因为,每个字符串都是以\0结束的,\0占用一个字节的空间。LENGTH(s)函数计算字符串s的长度,这个长度是指字符数,而不是指占用的空间。因此字符串“beijing”的长度 为7。
13.3.2 合并字符串的函数CONCAT(s1 ,s2,...)和C0NCAT_WS(x,s1 ,s2,...)
CONCAT(s1 ,s2,...)函数和C0NCAT_WS(x,s1 ,s2,...)函数都可以将sl、s2等多个字符串合并成一个字符串。但〔C0NCAT_WS(x,s1 ,s2,...)可以将各字符串直接用参数x隔开。
【示例13-14】下面将演示CONCAT(s1 ,s2,...)和C0NCAT_WS(x,s1 ,s2,...)函数的使用。
mysql> SELECT CONCAT('bei','ji','ng'),CONCAT('-','bei','ji','ng'); +-------------------------+-----------------------------+ | CONCAT('bei','ji','ng') | CONCAT('-','bei','ji','ng') | +-------------------------+-----------------------------+ | beijing | -beijing | +-------------------------+-----------------------------+ 1 row in set (0.00 sec)
结果显示,两个函数将3个字符串合并成一个字符串。但是后者使用“-”将每个字符串隔开。
技巧:CONCAT(s1 ,s2,...)和C0NCAT_WS(x,s1 ,s2,...)函数都是用来合并字符串,这两个函数在操作字符串时非常有用。例如,为了让空格显示更加明显,可以在空格两边加上“+”。这可以使用CONCAT('+',' ’,+)的方式组合起来,显示出来 就会是“+ +”,这样空格看起来更加明显。
13.3.3 替换字符串的函数 INSERT(s1,x,len,s2)
INSERT(s1,x,len,s2)函数将字符串sl中x位置开始长度为len的字符串用s2替换。
【示例13-15】下面将演示取INSERT(s1,x,len,s2)函数的使用。
mysql> SELECT s, INSERT(s,4,4,'fang') FROM t2; +---------+---------------------+ | s | INSERT(s,4,4,'fang')| +---------+---------------------+ | beijing | beifang | +---------+---------------------+ 1 row in set(0.00 sec)
结果显示,s字段的值为字符"beijing"。INSERT(s,4,4,'fang')是将s中的第4个字符 开始的4个字符用"fang"替换。也就是"jing"被"fang"替换。所以替换后的结果是"beifang"。
13.3.4字母大小写转换函数
UPPER(s)函数和UPCASE(s)函数将字符串s的所有字母变成大写字母;LOWER(s) 和LCASE(s)函数将字符串s的所有字母变成小写字母。
【示例 13-16】下面将演示 UPPER(s)、UCASE(s)、LOWER(s)和LCASE(s)4 个函数的使用。
mysql> SELECT UPPER('mysqr'),UCASE('mysql'),LOWER('MYSQL'),LCASE('MYSQL'); +----------------+----------------+----------------+----------------+ | UPPER('mysqr') | UCASE('mysql') | LOWER('MYSQL') | LCASE('MYSQL') | +----------------+----------------+----------------+----------------+ | MYSQR | MYSQL | mysql | mysql | +----------------+----------------+----------------+----------------+ 1 row in set (0.00 sec)
结果显示,UPPER('mysqr)和 UCASE(mysql')将 “ mysql ” 变成 “ MYSQL ” ;
LOWER('MYSQL')PLCASE('MYSQL')将“MYSQL” 变成 “mysql”。
13.3.5获取指定长度的字符串的函数LEFT(s,n),RIGHT(s,n)
LEFT(s,n)函数返回字符串s的前n个字符;RIGHT(s,n)函数返回字符串s的后n个字符。
【示例13-17】下面将演示LEFT(s,n),RIGHT(s,n)函数的使用。
mysql> SELECT s, LEFT(s,3), RIGHT(s,4) FROM t2; +-------+-----------+-----------+ | s | LEFT(s,3) | RIGHT(s,4)| +-------+-----------+-----------+ |beijing| bei | jing | +-------+-----------+-----------+ 1 row in set(0.00 sec)
结果显示,s字段的值为字符串"beijing";LEFT(s,3)返回前3个字母bei”; RIGHT(s,4)返回后4个字母“jing”。
13.3.6 填充字符串的函数LPAD(s1,len,s2),RPAD(s1,len,s2)
LPAD(s1,len,s2)函数将字符串s2填充到sl的开始处,使字符串长度达到len; RPAD(s1,len,s2)函数将字符串s2填充到sl的结尾处,使字符串长度达到len。
【示例13-18】下面将演示LPAD(s1,len,s2),RPAD(s1,len,s2)函数的使用。
mysql> SELECT s, LPAD(s,10,'+-'), RPAD(s,10,'+-') FROM t2; +--------+------------------+-----------------+ | s | LPAD(s,10,'+-') | RPAD(s,10,'+-') | +--------+------------------+-----------------+ |beijing | +-+beijing | beijinng+-+ | +--------+------------------+-----------------+ 1 row in set(0.00 sec)
结果显示,LPAD(s,10,'+-')将“+-”填充到字符串“beijing”的最前面,使字符串长度变为10。填充后字符串变为“+-+beijing”。RPAD(s,10,’+-'^)将“+-”填充到字符串“beijing”的最后,使字符串长度变为10。填充后字符串变为“beijing+-+”。
13.3.7删除空格的函数LTRIM(s)、RTRlM(s)和TRIM(s)/
LTRIM(s)函数将去掉字符串s开始处的空格;RTRIM(s)函数将去掉字符串s结尾处的空格;TRIM(s)函数将去掉字符串s开始处和结尾处的空格。
【示例13-19】下面将演示LTRIM(s)、RTRIM(s)、TWM(s)3个函数的使用。使用的字符串是‘ me ’。该字符串的开头和结尾各有一个空格。因为空格不好显示,所以使用CONCAT()函数来将字符串与‘+’连接起来。
mysql> SELECT CONCAT('+','me','+'), CONCAT('+',LTRIM('me'),'+'); +----------------------+-----------------------------+ | CONCAT('+','me','+') | CONCAT('+',LTRIM('me'),'+') | +----------------------+-----------------------------+ | +me+ | +me+ | +----------------------+-----------------------------+ 1 row in set (0.00 sec) +-----------------------------+----------------------------+ | CONCAT('+',RTRIM('me'),'+') | CONCAT('+',TRIM('me'),'+') | +-----------------------------+----------------------------+ | +me+ | +me+ | +-----------------------------+----------------------------+ 1 row in set (0.00 sec)
结果显示,直接使用CONCAT('+','me','+')时,系统会保留“me”前面和后面的空格; LTRIM(' me ’)将字符串前端的空格去掉了; RTRIM(' me ')将字符串最后的空格去掉了; TRIM(' me ’)将字符串最前端和最后面的空格去掉。
13.3.8删除指定字符串的函数TRIM(s1 FROM s)
TRIM(sl FROM s)函数将去掉字符串s中开始处和结尾处的字符串sl。
【示例13-20】下面将演示TRIM(sl FROM 8)函数的使用。
mysql> SELECT TRIM('ab' FROM 'ababddddabddab'); +----------------------------------+ | TRIM('ab' FROM 'ababddddabddab') | +----------------------------------+ | ddddabdd | +----------------------------------+ 1 row in set (0.00 sec)
结果显示,字符串“ababddddabddab”最前端和最后面的字符串“ab”去掉。而中间的“ab”还保留着。
技巧:通常,数据库中数据最好不要以空格开头或结尾。除非有特殊需要,例如,存储一篇文章时,需要使用空格调整格式。在输入字符串数据时,最好使用TRIM(s)去掉字符串开始和结束部分的空格。如果需要过滤掉某些敏感字符,可以使用 TRIM(sl FROM 8)函数将指定字符过滤掉。
13.3.9重复生成字符串的函数REPEAT(s,n)
REPEAT(s,n)函数将字符串s重复n次。
【示例13-21】下面将演示REPEAT(s,n)函数的使用。
mysql> SELECT REPEAT('mysql-',2); +--------------------+ | REPEAT('mysql-',2) | +--------------------+ | mysql-mysql- | +--------------------+ 1 row in set (0.00 sec)
结果显示,REPEAT(mysql-',2)返回的结果为mysql-mysql-。
13.3.10空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)
SPACE(n)函数返回n个空格;REPLACE(s,s1,s2)函数将字符串s2替代字符串s中的字符串sl。
【示例13-22】下面将演示SPACE(n),REPLACE(s,s1,s2)两个函数的使用。
mysql> SELECT CONCAT('+',SPACE(4),'+'),REPLACE('mysql','sql','book'); +--------------------------+-------------------------------+ | CONCAT('+',SPACE(4),'+') | REPLACE('mysql','sql','book') | +--------------------------+-------------------------------+ | + + | mybook | +--------------------------+-------------------------------+ 1 row in set (0.00 sec)
结果显示,SPACE(4)返回了4个空格;REPLACE('mysqr,'sql','book')"将"mysql"中的 “sql” 用 “book” 替换。
13.3.11 比较字符串大小的函数STRCMP(s1,s2)
STRCMP(s1,s2)函数用来比较字符串sl和s2。如果sl大于s2,等于$2,结果返回0;如果s1小于s2,结果返回-1。
【示例13-23】下面将演示STRCMP(sl,s2)函数的使用。
mysql> SELECT STRCMP('abc','abb'),STRCMP('abc','abc'),STRCMP('abc','abd'); +---------------------+---------------------+---------------------+ | STRCMP('abc','abb') | STRCMP('abc','abc') | STRCMP('abc','abd') | +---------------------+---------------------+---------------------+ | 1 | 0 | -1 | +---------------------+---------------------+---------------------+ 1 row in set (0.00 sec)
因为abc大于abb所以结果返回1;因为abc等于abc,所以结果返回0;因为abc小于abd所以结果返回-1。
13.3.12 获取子串的函数SUBSTRING(s,nJenpn MID(s,n,len)
SUBSTRING(s,nJenpn MID(s,n,len)从字符串s的第n个位置开始获取长度为len的字符串。
mysql>SELECT s,SUBSTRING(s,4,3),MID(s,4,3) FROM t2; +-------+------------------+--------------+ | s | SUBSTRING(s,4,3) | MID(s,4,3) | +-------+------------------+--------------+ |beijing| jin | jin | +-------+------------------+--------------+ 1 row in set (0.00 sec)
结果显示,两个函数从第4个位置开始,获取长度为3的字符串。
13.3.13匹配子串开始位置的函数
LOCATE(s 1 ,s),POSITION(s 1 W 8)和 INSfSTR(s,sl)3个函数从字符串s中获取sl的开始位置。
【示例 13-25】下面将演示 LOCATE(sl,s)、POSITION(sl EN 5)和 DsfSTR(s,sl)3 个函数的使用。
mysql> SELECT s ,LOCATE('jin',s), POSITION('jin. IN s), INSTR(s,'jin') FROM t2; +-------+------------------+------------------------+-----------------+ | s | LOCATE('jin',s) | POSITION('jin' IN s) | INSTR(s,'jin') | +-------+------------------+------------------------+-----------------+ |beijing| 4 | 4 | 4 | +-------+------------------+------------------------+-----------------+ 1 row in set (0.00 sec)
结果显示,s字段的值中“jin”的起始位置为4。
13.3.14字符串逆序的函数REVERSE(s)
REVERSE(s)函数将字符串s的顺序反过来。
【示例13-26】下面将演示REVERSE(s)函数的使用。
mysqt> SELECT s, REVERSE(s) FROM t2; +---------+-------------+ | s | REVERSE(s) | +---------+-------------+ | beijing | gnijieb | +---------+-------------+ 1 row in set (0.00 sec)
结果显示,REVERSE(s)将字符串s的顺序都反过来。
13.3.15返回指定位置的字符串的函数
ELT(n,sl,s2,...)函数返回第n个字符串。
【示例13-27】下面将演示ELT(n,sl,s2,...)函数的使用。
+-----------------------------+ | ELT(2,'me','my','he','she') | +-----------------------------+ | my | +-----------------------------+ 1 row in set (0.00 sec)
结果显示,('me','my','he','she')的第二个字符串是“my”。
13.3.16返回指定字符串位置的函数FELD(s,s1,s2,...)
FELD(s,s1,s2,...)函数返回第一个与字符串S匹配的字符串的位置。
【示例13-28】下面将演示FELD(s,s1,s2,...)函数的使用。
mysql> SELECT FIELD('he','me','my','he','she'); +----------------------------------+ | FIELD('he','me','my','he','she') | +----------------------------------+ | 3 | +----------------------------------+ 1 row in set (0.00 sec)
结果显示,“he”是('me','my','he','she')中的第3个字符串。
13.3.17返回子串位置的函数FIND_IN_SET(S1,S2)
FIND_IN_SET(S1,S2)函数返回在字符串s2中与sl匹配的字符串的位置。其中,字符串s2中包含了若干个用逗号隔开的字符串。
【示例13-29】下面将演示FIND_IN_SET(S1,S2)函数的使用。
mysql> SELECT FIND_IN_SET('like','i,like,bei,jing'); +---------------------------------------+ | FIND_IN_SET('like','i,like,bei,jing') | +---------------------------------------+ | 2 | +---------------------------------------+ 1 row in set (0.00 sec)
结果显示,字符串“like”在字符串“i,like,bei,jing”的第二个位置上。
13.3.18 选取字符串的函数 MAKE_SET(x,s1,s2,...)
MAKE_SET(x,s1,s2,...)函数按x的二进制数从sl,s2,...,sn中选取字符串。例如12的二进制是1100。这个二进制数从右到左的第3位和第4位是1,所以选取s3和s4。
【示例13-30】下面将演示MAKE_SET(x,sl,s2,…)函数的使用。
mysql> SELECT MAKE_SET(11 ,'a','b','c','d'), MAKE_SET(7,'a','b',' +-------------------------------+-----------------------------+ | MAKE_SET(11 ,'a','b','c','d') | MAKE_SET(7,'a','b','c','d') | +-------------------------------+-----------------------------+ | a,b,d | a,b,c | +-------------------------------+-----------------------------+ 1 row in set (0.00 sec)
因为11的二进制数是1011,从右到左的第1位、第2位和第4位是1,所以结果选取 a、匕和山因为7的二进制数是111,从右到左的第1位、第2位和第3位是1,所以结果 选取a、b和c。 含注意:使用MAKE_SET(x,sl,s2,...)函数时一定要特别注意。该函数是按照x所指定的顺 序查找指定字符串。数据库系统会先将义转换为二进制数,然后选取位数为1的 位置对应的字符串。读取二进制数的顺序是从右到左的,最右边的是第一位。