![MySQL 8从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/737/26542737/b_26542737.jpg)
6.3 字符串函数
字符串函数主要用来处理数据库中的字符串数据。MySQL中的字符串函数有计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。本节将介绍各种字符串函数的功能和用法。
6.3.1 计算字符串字符数的函数和字符串长度的函数
CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。
【例6.26】使用CHAR_LENGTH函数计算字符串字符个数,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/095.jpg?sign=1739284847-XHYC2uy3YObzKjzSu3Ihh7OxTqX692Bi-0-bdae00775f29b020af92fd897ff5c197)
LENGTH(str)返回值为字符串的字节长度,使用utf8(UNICODE的一种变长字符编码,又称万国码)编码字符集时,一个汉字是3字节,一个数字或字母算1字节。
【例6.27】使用LENGTH函数计算字符串长度,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/096.jpg?sign=1739284847-hxSIpJrCcB2K9bt0vUmGrI4b6zQgmcfi-0-50d84897130e22a43cf2d5dba95be314)
可以看到,计算的结果与CHAR_LENGTH相同,因为英文字符的个数和所占的字节相同,一个字符占1字节。
6.3.2 合并字符串函数CONCAT(s1,s2,…)、CONCAT_WS(x,s1,s2,…)
CONCAT(s1,s2,…)返回结果为连接参数产生的字符串,或许有一个或多个参数。如有任何一个参数为NULL,则返回值为NULL。如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
【例6.28】使用CONCAT函数连接字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/097.jpg?sign=1739284847-NHxrMLMQgPbSt2HJtFJ3a88JRqblZryp-0-6f3793600ae3e3fad3387194a62f19f2)
CONCAT('My SQL', '8.0')返回两个字符串连接后的字符串;CONCAT('My',NULL, 'SQL')中有一个参数为NULL,因此返回结果为NULL。
在CONCAT_WS(x,s1,s2,…)中,CONCAT_WS代表CONCAT With Separator,是CONCAT()的特殊形式。第一个参数x是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。
【例6.29】使用CONCAT_WS函数连接带分隔符的字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/098.jpg?sign=1739284847-33mJL431BotR5mzT4VpPVmTWad6IUn3V-0-134eecb0eea2f21cf2e080f3c2d3df7d)
CONCAT_WS('-', '1st','2nd', '3rd')使用分隔符‘-’将3个字符串连接成一个字符串,结果为“1st-2nd-3rd”;CONCAT_WS('*', '1st', NULL, '3rd')使用分隔符‘*’将两个字符串连接成一个字符串,同时忽略NULL值。
6.3.3 替换字符串的函数INSERT(s1,x,len,s2)
INSERT(s1,x,len,s2)返回字符串s1,其子字符串起始于x位置和被字符串s2取代的len字符。如果x超过字符串长度,则返回值为原始字符串。假如len的长度大于其他字符串的长度,则从位置x开始替换。若任何一个参数为NULL,则返回值为NULL。
【例6.30】使用INSERT函数进行字符串替代操作,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/099.jpg?sign=1739284847-uj2DWcMrQZiO12563fBkbiQxkaIH0wNa-0-94449516e2644cb920b73cf6f7055874)
第一个函数INSERT('Quest', 2, 4, 'What')将“Quest”第2个字符开始长度为4的字符串替换为What,结果为“QWhat”;第二个函数INSERT('Quest', -1, 4, 'What')中起始位置-1超出了字符串长度,直接返回原字符;第三个函数INSERT('Quest', 3, 100, 'What')替换长度超出了原字符串长度,则从第3个字符开始,截取后面所有的字符,并替换为指定字符What,结果为“QuWhat”。
6.3.4 字母大小写转换函数
LOWER (str)或者LCASE (str)可以将字符串str中的字母字符全部转换成小写字母。
【例6.31】使用LOWER函数或者LCASE函数将字符串中所有字母字符转换为小写,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/100.jpg?sign=1739284847-yUAK4sXQosrer3rInOpgUjVFzW17x0wc-0-a7925abfbe6ed6f99741bcd59049b66c)
由结果可以看到,原来所有字母为大写的,全部转换为小写,如“BEAUTIFUL”,转换之后为“beautiful”;大小写字母混合的字符串,小写不变,大写字母转换为小写字母,如“WelL”,转换之后为“well”。
UPPER(str)或者UCASE(str)可以将字符串str中的字母字符全部转换成大写字母。
【例6.32】使用UPPER函数或者UCASE函数将字符串中所有字母字符转换为大写,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/101.jpg?sign=1739284847-pXXFeHyrvNXyHMNLVRQ8cKqNTGAUX3Zg-0-cfafda4e06fe98060f8205b9468e024f)
由结果可以看到,原来所有字母字符为小写的,全部转换为大写,如“black”,转换之后为“BLACK”;大小写字母混合的字符串,大写不变,小写字母转换为大写字母,如“BLacK”,转换之后为“BLACK”。
6.3.5 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)
LEFT(s,n)返回字符串s开始的最左边n个字符。
【例6.33】使用LEFT函数返回字符串中左边的字符,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/102.jpg?sign=1739284847-kWxTdbLKAbxLf7mGdCRxOqN1ZhtlvZHe-0-13a20dd66b6d198dfceabdfc24c50560)
函数返回字符串“football”左边开始的长度为5的子字符串,结果为“footb”。
RIGHT(s,n)返回字符串str最右边的n个字符。
【例6.34】使用RIGHT函数返回字符串中右边的字符,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/103.jpg?sign=1739284847-gsveYrREeWTGotPavCb0wxPPbuCjrPEc-0-52d37bae3d9c9549bceb2579b674ed57)
函数返回字符串“football”右边开始的长度为4的子字符串,结果为“ball”。
6.3.6 填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)
LPAD(s1,len,s2)返回字符串s1,其左边由字符串s2填补到len字符长度。假如s1的长度大于len,则返回值被缩短至len字符。
【例6.35】使用LPAD函数对字符串进行填充操作,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/104.jpg?sign=1739284847-oHKp7u3ZGKAxTDmov16pYOA11CPZGXdX-0-be380c8d55185303cfa2f1394f103030)
字符串“hello”长度大于4,不需要填充,因此LPAD('hello',4,'??')只返回被缩短的长度为4的子串“hell”;字符串“hello”长度小于10,LPAD('hello',10,'??')返回结果为“?????hello”,左侧填充‘?’,长度为10。
RPAD(s1,len,s2)返回字符串sl,其右边被字符串s2填补至len字符长度。假如字符串s1的长度大于len,则返回值被缩短到len字符长度。
【例6.36】使用RPAD函数对字符串进行填充操作,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/105.jpg?sign=1739284847-6NoKoVbDsve9qtEVko47vXSWeVrvJI0E-0-3537b504c2f4e6ff2cbfb48970d92b5f)
字符串“hello”长度大于4,不需要填充,因此RPAD('hello',4,'?')只返回被缩短的长度为4的子串“hell”;字符串“hello”长度小于10,RPAD('hello',10,'?')返回结果为“hello?????”,右侧填充‘?’,长度为10。
6.3.7 删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)
LTRIM(s)返回字符串s,字符串左侧空格字符被删除。
【例6.37】使用LTRIM函数删除字符串左边的空格,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/106.jpg?sign=1739284847-bE4eN35wVowFLSccvtMlwG0Bb27KlklX-0-bedae92db70d04b27d04bfc697569228)
LTRIM只删除字符串左边的空格,而右边的空格不会被删除,“ book ”删除左边空格之后的结果为“book”。
RTRIM(s)返回字符串s,字符串右侧空格字符被删除。
【例6.38】使用RTRIM函数删除字符串右边的空格,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/107.jpg?sign=1739284847-Hn2wJfwrjywE2HcvYa4vmu87CtFSkUB2-0-a2791e3154294d99689544810b3e5a99)
RTRIM只删除字符串右边的空格,左边的空格不会被删除,“ book ”删除右边空格之后的结果为“ book”。
TRIM(s)删除字符串s两侧的空格。
【例6.39】使用TRIM函数删除字符串两侧的空格,使用语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/108.jpg?sign=1739284847-6P5zLBSqtkjaFxO6XSE9X5KZSqUWP6NY-0-94cff55d3814d016ede7df92a5b8c96b)
可以看到,函数执行之后字符串“ book ”两边的空格都被删除,结果为“book”。
6.3.8 删除指定字符串的函数TRIM(s1 FROM s)
TRIM(s1 FROM s)删除字符串s中两端所有的子字符串s1。s1为可选项,在未指定情况下,删除空格。
【例6.40】使用TRIM(s1 FROM s)函数删除字符串中两端指定的字符,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/109.jpg?sign=1739284847-6rFFHs5IqCLfSO6OuxYy2Ck8cWpZp1Zd-0-22bd767b41809f4f8004c2de3a1534f2)
删除字符串“xyxboxyokxxyxy”两端的重复字符串“xy”,而中间的“xy”并不删除,结果为“xboxyokx”。
6.3.9 重复生成字符串的函数REPEAT(s,n)
REPEAT(s,n)返回一个由重复的字符串s组成的字符串,字符串s的数目等于n。若n<=0,则返回一个空字符串。若s或n为NULL,则返回NULL。
【例6.41】使用REPEAT函数重复生成相同的字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/110.jpg?sign=1739284847-PWcK0VpZvGvC2hdnxmfTWTW8JCxEkp4B-0-b0fc4a523890a75eec7ffbbb45616571)
REPEAT('MySQL', 3)函数返回的字符串由3个重复的“MySQL”字符串组成。
6.3.10 空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)
SPACE(n)返回一个由n个空格组成的字符串。
【例6.42】使用SPACE函数生成由空格组成的字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/111.jpg?sign=1739284847-eJ0uCFV95KBghrMFAE1oY4jgQb9CBRfh-0-c2fd60e8d29744b12eaf2125195e9b5a)
SPACE(6)返回的字符串由6个空格组成。
REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1。
【例6.43】使用REPLACE函数进行字符串替代操作,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/112.jpg?sign=1739284847-ov6QzeILNOkEg3WXX1T0yJvJVgOFpQKZ-0-fc3e61530ee63a4ce5e9a7740ed692a7)
REPLACE('xxx.MySQL.com', 'x', 'w')将“xxx.MySQL.com”字符串中的‘x’字符替换为‘w’字符,结果为“www.MySQL.com”。
6.3.11 比较字符串大小的函数STRCMP(s1,s2)
STRCMP(s1,s2):若所有的字符串均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回-1;其他情况返回1。
【例6.44】使用STRCMP函数比较字符串大小,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/113.jpg?sign=1739284847-kOC4mi8ORrEOkAoEpe1FGxEsJB6Q85SE-0-9dc88ed39b39f8770efcb01b580c7261)
“txt”小于“txt2”,因此STRCMP('txt', 'txt2')返回结果为-1,STRCMP('txt2', 'txt')返回结果为1;“txt”与“txt”相等,因此STRCMP('txt', 'txt')返回结果为0。
6.3.12 获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len)
SUBSTRING(s,n,len)带有len参数的格式,从字符串s返回一个长度与len字符相同的子字符串,起始于位置n。也可能对n使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的n字符,即倒数第n个字符,而不是字符串的开头位置。
【例6.45】使用SUBSTRING函数获取指定位置处的子字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/114.jpg?sign=1739284847-xVgKimVR7X7tjqbqL5L9dgScWTJbwAuO-0-4470f8e2c8a8e4c7a8ace7c77bbb846f)
SUBSTRING('breakfast',5)返回从第5个位置开始到字符串结尾的子字符串,结果为“kfast”;SUBSTRING('breakfast',5,3)返回从第5个位置开始长度为3的子字符串,结果为“kfa”;SUBSTRING('lunch', -3)返回从结尾开始第3个位置到字符串结尾的子字符串,结果为“nch”;SUBSTRING('lunch', -5, 3)返回从结尾开始第5个位置,即字符串开头起,长度为3的子字符串,结果为“lun”。
MID(s,n,len)与SUBSTRING(s,n,len)的作用相同。
【例6.46】使用MID()函数获取指定位置处的子字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/115.jpg?sign=1739284847-pNSq6dwvNdJykPcgPtkkO5edCEodEET4-0-6684648069f1c15d343f3037e032655a)
可以看到MID和SUBSTRING的结果是一样的。
提示
如果对len使用的是一个小于1的值,则结果始终为空字符串。
6.3.13 匹配子串开始位置的函数
LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str, str1)3个函数的作用相同,返回子字符串str1在字符串str中的开始位置。
【例6.47】使用LOCATE、POSITION、INSTR函数查找字符串中指定子字符串的开始位置,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/116.jpg?sign=1739284847-rw2BWzfMKodLkdxbpfWQ5YU0Hx5uJySB-0-d1326b0e2485b25fcc8ee7bd5392fe15)
子字符串“ball”在字符串“football”中从第5个字母位置开始,因此3个函数返回结果都为5。
6.3.14 字符串逆序的函数REVERSE(s)
REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符串顺序相反。
【例6.48】使用REVERSE函数反转字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/117.jpg?sign=1739284847-yFBKSj9L3Frz1dYlnnBwE9pADnNAy3FD-0-23afe11fb7a28c09cb97fc3004f6a28f)
可以看到,字符串“abc”经过REVERSE函数处理之后所有字符串顺序被反转,结果为“cba”。
6.3.15 返回指定位置的字符串的函数
ELT(N,字符串1,字符串2,字符串3,...,字符串N):若N = 1,则返回值为字符串1;若N=2,则返回值为字符串2;以此类推;若N小于1或大于参数的数目,则返回值为NULL。
【例6.49】使用ELT函数返回指定位置字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/118.jpg?sign=1739284847-ljuake0FvBIcziwMvCBmR7kIt4JACkZg-0-9a18a91416d448489029f4ac55815b58)
由结果可以看到,ELT(3,'1st','2nd','3rd')返回第3个位置的字符串“3rd”;ELT(3,'net','os')指定返回字符串位置超出参数个数,返回NULL。
6.3.16 返回指定字符串位置的函数FIELD(s,s1,s2,…,sn)
FIELD(s,s1,s2,…,sn)返回字符串s在列表s1,s2,…,sn中第一次出现的位置,在找不到s的情况下,返回值为0。如果s为NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。
【例6.50】使用FIELD函数返回指定字符串第一次出现的位置,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/119.jpg?sign=1739284847-l9CcQtlURHbgZRLODHUv31IfZafYqmbv-0-6db26453c022bcc859c8c71dfc314ff6)
在FIELD('Hi', 'hihi', 'Hey', 'Hi', 'bas')函数中,字符串“Hi”出现在列表的第3个字符串位置,因此返回结果为3;FIELD('Hi', 'Hey', 'Lo', 'Hilo', 'foo')列表中没有字符串“Hi”,因此返回结果为0。
6.3.17 返回子串位置的函数FIND_IN_SET(s1,s2)
FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号‘,’分开的字符串组成的列表。如果s1不在s2或s2为空字符串,则返回值为0。如果任意一个参数为NULL,则返回值为NULL。这个函数在第一个参数包含一个逗号‘,’时将无法正常运行。
【例6.51】使用FIND_IN_SET()函数返回子字符串在字符串列表中的位置,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/120.jpg?sign=1739284847-bc0Jj9fEkTfMqvTiRC2vRWy9wd7rOg0F-0-dcdae9a14491a05459f2336d70e533fa)
虽然FIND_IN_SET()和FIELD()两个函数格式不同,但作用类似,都可以返回指定字符串在字符串列表中的位置。
6.3.18 选取字符串的函数MAKE_SET(x,s1,s2,…,sn)
MAKE_SET(x,s1,s2,…,sn)函数按x的二进制数从s1,s2,…,sn中选取字符串。例如5的二进制是0101,这个二进制从右往左的第1位和第3位是1,所以选取s1和s3。s1,s2,...,sn中的NULL值不会被添加到结果中。
【例6.52】使用MAKE_SET根据二进制位选取指定字符串,输入语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/121.jpg?sign=1739284847-G2qrUuNzAeUB7cDCbJML5bAiiV6lGqKF-0-22d52d47f366ca78162339f2098792af)
1的二进制值为0001,4的二进制值为0100,1与4进行或操作之后的二进制值为0101,从右到左第1位和第3位为1。MAKE_SET(1,'a','b','c')返回第1个字符串;SET(1 | 4,'hello','nice','world')返回从左端开始第1个和第3个字符串组成的字符串;NULL不会添加到结果中,因此SET(1 | 4,'hello','nice',NULL,'world')只返回第1个字符串‘hello’;SET(0,'a','b','c')返回空字符串。