字符串函数主要用来处理数据库中的字符串数据。MySQL中的字符串函数有计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。本节将介绍各种字符串函数的功能和用法。
CHAR_LENGTH(str)的返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。
【 例4.26 】使用CHAR_LENGTH()函数计算字符串中的字符个数,SQL语句如下:
mysql> SELECT CHAR_LENGTH('date'), CHAR_LENGTH('egg'); +-----------------------------+---------------------+ | CHAR_LENGTH('date') | CHAR_LENGTH('egg') | +-----------------------------+---------------------+ | 4 | 3 | +-----------------------------+---------------------+
LENGTH(str)的返回值为字符串的字节长度,使用utf8(UNICODE的一种变长字符编码,又称万国码)编码字符集时,一个汉字是3字节,一个数字或字母是1字节。
【 例4.27 】使用LENGTH()函数计算字符串长度,SQL语句如下:
mysql> SELECT LENGTH('date'), LENGTH('egg'); +----------------+---------------+ | LENGTH('date') | LENGTH('egg') | +----------------+---------------+ | 4 | 3 | +----------------+---------------+
可以看到,LENGTH()函数的计算结果与CHAR_LENGTH()相同,因为英文字符的个数和所占的字节数相同,一个字符占1字节。
CONCAT(s1,s2,...)的返回结果为所有参数相连而产生的新字符串,或许有一个或多个参数。如果任何一个参数为NULL,则返回值为NULL;如果所有参数均为非二进制字符串,则结果为非二进制字符串;如果参数中含有二进制字符串,则结果为一个二进制字符串。
【 例4.28 】使用CONCAT()函数连接字符串,SQL语句如下:
mysql> SELECT CONCAT('My SQL', '9.0'),CONCAT('My',NULL, 'SQL'); +-------------------------+--------------------------+ | CONCAT('My SQL', '9.0') | CONCAT('My',NULL, 'SQL') | +-------------------------+--------------------------+ | My SQL9.0 | NULL | +-------------------------+--------------------------+
CONCAT('My SQL', '9.0')返回两个字符串相连之后的新字符串;CONCAT('My',NULL,'SQL')中有一个参数为NULL,因此返回结果为NULL。
在CONCAT_WS(x,s1,s2,...)中,CONCAT_WS代表CONCAT With Separator,是CONCAT()的特殊形式。第一个参数x是其他参数的分隔符,分隔符放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL。
【 例4.29 】使用CONCAT_WS()函数连接带分隔符的字符串,SQL语句如下:
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 | +------------------------------------+------------------------------------+
CONCAT_WS('-', '1st','2nd', '3rd')使用分隔符“-”将3个字符串连接成一个字符串,结果为“1st-2nd-3rd”;CONCAT_WS('*', '1st', NULL, '3rd')使用分隔符“*”将两个字符串连接成一个字符串,同时忽略NULL。
NSERT(s1,x,len,s2)返回一个新的字符串,其内容是将字符串s1中从位置x开始的len个字符替换为字符串s2的内容。如果x超过字符串s1的长度,则返回值为原始字符串;如果len的长度超出了字符串s1的长度,则从位置x开始替换到s1的末尾;若任何一个参数为NULL,则返回值为NULL。
【 例4.30 】使用INSERT()函数进行字符串替换操作,SQL语句如下:
MySQL> SELECT INSERT('Quest', 2, 4, 'What') AS col1, INSERT('Quest', -1, 4, 'What') AS col2, INSERT('Quest', 3, 100, 'What') AS col3; +--------+-------+-----------+ | col1 | col2 | col3 | +--------+-------+-----------+ | QWhat | Quest | QuWhat | +--------+-------+-----------+
第一个函数INSERT('Quest', 2, 4, 'What')将“Quest”从第2个字符开始长度为4的字符串替换为What,结果为“QWhat”;第二个函数INSERT('Quest', -1, 4, 'What')中的起始位置−1超出了字符串长度,直接返回原字符;第三个函数INSERT('Quest', 3, 100, 'What')的替换长度超出了原字符串长度,则从第3个字符开始,截取后面所有的字符,并替换为指定字符What,结果为“QuWhat”。
LOWER (str)或者LCASE (str)可以将字符串str中的大写字母全部转换为小写字母。
【 例4.31 】使用LOWER()函数或者LCASE()函数将字符串中所有大写字母转换为小写字母,SQL语句如下:
mysql> SELECT LOWER('BEAUTIFUL'), LCASE('Well'); +--------------------+---------------+ | LOWER('BEAUTIFUL') | LCASE('Well') | +--------------------+---------------+ | beautiful | well | +--------------------+---------------+
由结果可以看到,原来所有字母为大写的,都被转换为小写,如“BEAUTIFUL”转换之后为“beautiful”;大小写字母混合的字符串,小写不变,大写字母转换为小写字母,如“WelL”转换之后为“well”。
UPPER(str)或者UCASE(str)可以将字符串str中的小写字母全部转换为大写字母。
【 例4.32 】使用UPPER()函数或者UCASE()函数将字符串中所有小写字母转换为大写字母,SQL语句如下:
mysql> SELECT UPPER('black'), UCASE('BLacK'); +----------------+----------------+ | UPPER('black') | UCASE('BLacK') | +----------------+----------------+ | BLACK | BLACK | +----------------+----------------+
由结果可以看到,原来所有字母为小写的,全部转换为大写,如“black”转换之后为“BLACK”;大小写字母混合的字符串,大写不变,小写字母转换为大写字母,如“BLacK”转换之后为“BLACK”。
LEFT(s,n)返回字符串s中的最左边n个字符。
【 例4.33 】使用LEFT()函数返回字符串中左边的字符,SQL语句如下:
mysql> SELECT LEFT('football', 5); +---------------------+ | LEFT('football', 5) | +---------------------+ | footb | +---------------------+
LEFT()函数返回字符串“football”从左边开始的长度为5的子字符串,结果为“footb”。
RIGHT(s,n)返回字符串str中的最右边的n个字符。
【 例4.34 】使用RIGHT()函数返回字符串中右边的字符,SQL语句如下:
MySQL> SELECT RIGHT('football', 4); +----------------------+ | RIGHT('football', 4) | +----------------------+ | ball | +----------------------+
RIGHT()函数返回字符串“football”从右边开始的长度为4的子字符串,结果为“ball”。
LPAD(s1,len,s2)返回一个新字符串,新字符串的内容是将字符串s1的左侧用字符串s2填充至len个字符长度。如果s1的长度本身已经大于或等于len,则返回值被缩短至len个字符。
【 例4.35 】使用LPAD()函数对字符串进行填充操作,SQL语句如下:
MySQL> SELECT LPAD('hello',4,'?'), LPAD('hello',10,'?'); +----------------------+-----------------------+ | LPAD('hello',4,'?') | LPAD('hello',10,'?') | +----------------------+-----------------------+ | hell | ?????hello | +----------------------+-----------------------+
字符串“hello”的长度大于4,不需要填充,因此LPAD('hello',4,'??')只返回被缩短的长度为4的子字符串“hell”;字符串“hello”的长度小于10,因此LPAD('hello',10,'??')的返回结果为“?????hello”,左侧填充“?”,长度为10。
RPAD(s1,len,s2)返回一个新字符串,新字符串的内容是将字符串s1的右侧用字符串s2填充至len个字符长度。如果s1的长度本身已经大于或等于len,则返回值被缩短至len个字符。
【 例4.36 】使用RPAD()函数对字符串进行填充操作,SQL语句如下:
mysql> SELECT RPAD('hello',4,'?'), RPAD('hello',10,'?'); +---------------------+----------------------+ | RPAD('hello',4,'?') | RPAD('hello',10,'?') | +---------------------+----------------------+ | hell | hello????? | +---------------------+----------------------+
字符串“hello”的长度大于4,不需要填充,因此RPAD('hello',4,'?')只返回被缩短的长度为4的子串“hell”;字符串“hello”的长度小于10,因此RPAD('hello',10,'?')的返回结果为“hello?????”,右侧填充“?”,长度为10。
LTRIM(s)返回被删除了左侧空格的字符串s。
【 例4.37 】使用LTRIM()函数删除字符串左边的空格,SQL语句如下:
mysql> SELECT '( book )',CONCAT('(',LTRIM(' book '),')'); +------------+-----------------------------------+ | ( book ) | CONCAT('(',LTRIM(' book '),')') | +------------+-----------------------------------+ | ( book ) | (book ) | +------------+-----------------------------------+
LTRIM()只删除字符串左边的空格,而右边的空格不会被删除,因此“ book ”在删除左边空格之后的结果为“book ”。
RTRIM(s)返回被删除了右侧空格的字符串s。
【 例4.38 】使用RTRIM()函数删除字符串右边的空格,SQL语句如下:
mysql> SELECT '( book )',CONCAT('(', RTRIM (' book '),')'); +------------+-------------------------------------+ | ( book ) | CONCAT('(', RTRIM (' book '),')') | +------------+-------------------------------------+ | ( book ) | ( book) | +------------+-------------------------------------+
RTRIM()只删除字符串右边的空格,左边的空格不会被删除,因此“ book ”在删除右边空格之后的结果为“ book”。
TRIM(s)删除字符串s两侧的空格。
【 例4.39 】使用TRIM()函数删除字符串两侧的空格,SQL语句如下:
mysql> SELECT '( book )',CONCAT('(', TRIM(' book '),')'); +------------+-----------------------------------+ | ( book ) | CONCAT('(', TRIM(' book '),')') | +------------+-----------------------------------+ | ( book ) | (book) | +------------+-----------------------------------+
可以看到,函数执行之后,字符串“ book ”两边的空格都被删除,结果为“book”。
TRIM(s1 FROM s)删除字符串s两端所有的子字符串s1。s1为可选项,在未指定情况下,默认删除s两端的空格。
【 例4.40 】使用TRIM(s1 FROM s)函数删除字符串两端指定的字符,SQL语句如下:
mysql> SELECT TRIM('xy' FROM 'xyxboxyokxxyxy') ; +----------------------------------+ | TRIM('xy' FROM 'xyxboxyokxxyxy') | +----------------------------------+ | xboxyokx | +----------------------------------+
TRIM(s1 FROM s)函数会删除字符串“xyxboxyokxxyxy”两端的重复字符串“xy”,而中间的“xy”并不删除,因此结果为“xboxyokx”。
REPEAT(s,n)返回一个由重复的字符串s组成的新字符串,字符串s的数目等于n。若n≤0,则返回一个空字符串;若s或n为NULL,则返回NULL。
【 例4.41 】使用REPEAT()函数重复生成相同的字符串,SQL语句如下:
mysql> SELECT REPEAT('mysql', 3); +--------------------+ | REPEAT('mysql', 3) | +--------------------+ | mysqlmysqlmysql | +--------------------+
REPEAT('mysql', 3)函数返回由3个重复的“mysql”字符串组成的新字符串。
SPACE(n)返回一个由n个空格组成的字符串。
【 例4.42 】使用SPACE()函数生成由空格组成的字符串,SQL语句如下:
mysql> SELECT CONCAT('(', SPACE(6), ')' ); +-----------------------------+ | CONCAT('(', SPACE(6), ')' ) | +-----------------------------+ | ( ) | +-----------------------------+
SPACE(6)返回的字符串由6个空格组成。
REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1。
【 例4.43 】使用REPLACE()函数进行字符串替代操作,SQL语句如下:
mysql> SELECT REPLACE('xxx.mysql.com', 'x', 'w'); +------------------------------------+ | REPLACE('xxx.mysql.com', 'x', 'w') | +------------------------------------+ | www.mysql.com | +------------------------------------+
REPLACE('xxx.mysql.com', 'x', 'w')将“xxx.mysql.com”字符串中的“x”字符替换为“w”字符,结果为“www.mysql.com”。
STRCMP(s1,s2)函数用于比较字符串s1和s2的大小,若两个字符串s1和s2完全相同,则返回0;若根据当前的字符排序规则,字符串s1小于字符串s2,则返回-1;其他情况返回1。
【 例4.44 】使用STRCMP()函数比较字符串大小,SQL语句如下:
mysql> SELECT STRCMP('txt', 'txt2'),STRCMP('txt2', 'txt'), STRCMP('txt', 'txt'); +-----------------------+-----------------------+----------------------+ | STRCMP('txt', 'txt2') | STRCMP('txt2', 'txt') | STRCMP('txt', 'txt') | +-----------------------+-----------------------+----------------------+ | -1 | 1 | 0 | +-----------------------+-----------------------+----------------------+
“txt”小于“txt2”,因此STRCMP('txt', 'txt2')的返回结果为−1,STRCMP('txt2', 'txt')的返回结果为1;“txt”与“txt”相等,因此STRCMP('txt', 'txt')的返回结果为0。
SUBSTRING(s,n,len)函数返回一个从字符串s的第n位开始的、长度为len的子字符串。如果n为负值,则子字符串的起始位置是从字符串s的末尾往前数的第n个字符;如果n的值超出了字符串s的长度范围,则返回一个空字符串;如果len的值大于剩余子字符串的长度,则返回从n开始到字符串末尾的子字符串。
【 例4.45 】使用SUBSTRING()函数获取指定位置处的子字符串,SQL语句如下:
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 | +-------+-------+------+------+
SUBSTRING('breakfast',5)返回从字符串“breakfast”第5个位置开始到结尾的子字符串,结果为“kfast”;SUBSTRING('breakfast',5,3)返回从字符串“breakfast”第5个位置开始、长度为3的子字符串,结果为“kfa”;SUBSTRING('lunch', -3)返回从字符串“breakfast”结尾开始往前数第3个位置到字符串结尾的子字符串,结果为“nch”;SUBSTRING('lunch', -5, 3)返回从字符串“breakfast”结尾开始往前数第5个位置开始、长度为3的子字符串,结果为“lun”。
MID(s,n,len)与SUBSTRING(s,n,len)的作用相同。
【 例4.46 】使用MID()函数获取指定位置处的子字符串,SQL语句如下:
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 | +-------+-------+------+------+
可以看到MID()和SUBSTRING()的结果是一样的。
提示 如果对len使用的是一个小于1的值,则结果始终为空字符串。
LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str, str1)这3个函数的作用相同,都返回子字符串str1在字符串str中的开始位置。
【 例4.47 】使用LOCATE()、POSITION()、INSTR()函数查找字符串中指定子字符串的开始位置,SQL语句如下:
mysql> SELECT LOCATE('ball','football'),POSITION('ball'IN 'football'),INSTR ('football', 'ball'); +-------------+-------------------+---------------------+ | LOCATE('ball','football') | POSITION('ball'IN 'football') | INSTR ('football', 'ball') | +-------------+------------------+---------------------+ | 5 | 5 | 5 | +-------------+------------------+---------------------+
子字符串“ball”在字符串“football”中是从第5个位置开始的,因此3个函数的返回结果都为5。
REVERSE(s)将字符串s反转,返回的字符串的顺序和字符串s的顺序相反。
【 例4.48 】使用REVERSE()函数反转字符串,SQL语句如下:
mysql> SELECT REVERSE('abc'); +--------------------+ | REVERSE('abc') | +--------------------+ | cba | +--------------------+
可以看到,字符串“abc”经过REVERSE()函数处理之后,所有字母顺序被反转,结果为“cba”。
ELT(N,字符串1,字符串2,字符串3,...,字符串N)函数返回指定位置的字符串,如果N的值等于1,则返回第1个字符串(字符串1);如果N的值等于2,则返回第2个字符串(字符串2);以此类推。如果N的值小于1或大于参数的总数,则返回NULL。
【 例4.49 】使用ELT()函数返回指定位置的字符串,SQL语句如下:
mysql> SELECT ELT(3,'1st','2nd','3rd'), ELT(3,'net','os'); +--------------------------+-------------------+ | ELT(3,'1st','2nd','3rd') | ELT(3,'net','os') | +--------------------------+-------------------+ | 3rd | NULL | +--------------------------+-------------------+
由结果可以看到,ELT(3,'1st','2nd','3rd')返回第3个字符串“3rd”;ELT(3,'net','os')指定返回的字符串位置超出了参数个数,因此返回NULL。
FIELD(s,s1,s2,...,sn)返回字符串s在字符串列表s1,s2,...,sn中第一次出现的位置,在找不到s的情况下,返回0。如果s为NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。
【 例4.50 】使用FIELD()函数返回指定字符串第一次出现的位置,SQL语句如下:
mysql> SELECT FIELD('Hi', 'hihi', 'Hey', 'Hi', 'bas') as col1, FIELD('Hi', 'Hey', 'Lo', 'Hilo', 'foo') as col2; +------+-------+ | col1 | col2 | +------+-------+ | 3 | 0 | +------+-------+
在FIELD('Hi', 'hihi', 'Hey', 'Hi', 'bas')函数中,字符串“Hi”出现在字符串列表的第3个位置,因此返回结果为3;在FIELD('Hi', 'Hey', 'Lo', 'Hilo', 'foo')函数中,列表中没有字符串“Hi”,因此返回结果为0。
FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号(,)分开的字符串组成的列表。如果s1不在s2中或s2为空字符串,则返回值为0;如果任意一个参数为NULL,则返回值为NULL。如果这个函数的第一个参数中包含一个逗号,则该函数将无法正常运行。
【 例4.51 】使用FIND_IN_SET()函数返回子字符串在字符串列表中的位置,SQL语句如下:
mysql> SELECT FIND_IN_SET('Hi','hihi,Hey,Hi,bas'); +---------------------------------------------+ | FIND_IN_SET('Hi','hihi,Hey,Hi,bas') | +---------------------------------------------+ | 3 | +---------------------------------------------+
虽然FIND_IN_SET()和FIELD()两个函数的格式不同,但作用类似,都可以返回指定字符串在字符串列表中的位置。
MAKE_SET(x,s1,s2,...,sn)函数按x的二进制数从s1,s2,...,sn中选取字符串。例如5的二进制值是0101,这个二进制从右往左的第1位和第3位是1,所以选取s1和s3。s1,s2,...,sn中的NULL不会被添加到结果中。
【 例4.52 】使用MAKE_SET根据二进制位选取指定字符串,SQL语句如下:
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的二进制值为0001,4的二进制值为0100,1与4进行或操作之后的二进制值为0101,从右到左的第1位和第3位为1。MAKE_SET(1,'a','b','c')返回第1个字符串;MAKE_SET(1 |4,'hello','nice','world')返回从左侧开始的由第1个和第3个字符串组成的新字符串;NULL不会添加到结果中,因此MAKE_SET(1 | 4,'hello','nice',NULL,'world')只返回第1个字符串“hello”;MAKE_SET(0,'a','b','c')返回空字符串。