字符串函数:https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_unhex
长度
- CHAR_LENGTH(str):返回字符串str的所包含字符个数
- LENGTH(str)返回字符串的字节长度
SELECT CHAR_LENGTH('asdfg')
-- 5
SELECT CHAR_LENGTH('东方饭店')
-- 4
SELECT LENGTH('asdfg')
-- 5
SELECT LENGTH('东方饭店')
-- 12(一个汉字是三个字节)
拼接
- CONCAT(s1, s2, s3, …):将s1,s2,s3,…拼接,如果有参数为null,则返回null。
- CONCAT_WS(x, s1, s2, s3, …):第一个参数x是其它参数的分隔符,分隔符的位置放在要连接的两个字符串之间,忽略null。
SELECT CONCAT(110, 1321, 2432)
-- 11013212432
SELECT CONCAT('www', 'huya', 'com')
-- wwwhuyacom
SELECT CONCAT_WS(11, 2323, 4545)
-- 2323114545
SELECT CONCAT_WS('@', 'www', 'huya', 'com')
-- www@huya@com
截取
- LEFT(s,n):返回字符串s开始的最左边n个字符
- RIGHT(s,n):返回字符串s最右边n字符
SELECT LEFT('abcdefg', 3)
-- abc
SELECT RIGHT('abcdefg', 4)
-- defg
- MID(), SUBSTR(), SUBSTRING() 效果相同
SUBSTR(str, n, len)
截取字符串str,起始于位置n,长度是len。若len省略,截取n及之后的字符串。n为负数时,是倒着数,但返回结果是正常顺序。
SELECT SUBSTR('11012342325', 4, 4)
-- 1234
SELECT SUBSTR('11012342325', 4)
-- 12342325
SELECT SUBSTR('11012342325', -4, 4)
-- 2325
SELECT SUBSTR('11012342325', -5)
-- 42325
- SUBSTRING_INDEX(str, s, n):返回字符s在str中第n次出现位置之前的字符串
SELECT SUBSTRING_INDEX('www.youku.com.cn', '.', -2)
-- com.cn
SELECT SUBSTRING_INDEX('www.youku.com.cn', '.', -1)
-- cn
SELECT SUBSTRING_INDEX('www.youku.com.cn', '.', 1)
-- www
SELECT SUBSTRING_INDEX('www.youku.com.cn', '.', 2)
-- www.youku
查找
- FIELD(str, str1, str2, str3,…)
返回str在字符串列表(str1, str2, str3,…)中的位置索引,没找到就返回0
如果所有参数是字符串,则作为字符串进行比较。如果所有参数是数字,则将它们作为数字进行比较
SELECT FIELD('abc', 'acd', 'abb', 'abc', 'bbc')
-- 3
SELECT FIELD('a', 'ab', 'ac', 'aac', 'bbc')
-- 0
- FIND_IN_SET(str, strlist)
如果str在strlist中 ,则返回1到N范围内的值 。字符串列表是由以字符分隔的子字符串组成的字符串
SELECT FIND_IN_SET('a', 'fdgdag')
-- 0
SELECT FIND_IN_SET('a', 'bbacca')
-- 0
SELECT FIND_IN_SET('a', 'b,b,a,b')
-- 3
SELECT FIND_IN_SET('a', 'b, b, a, b')
-- 0
- INSTR(str, s1)
返回字符串str中第一次出现子字符串s1的位置
SELECT INSTR('foobarba', 'ba');
-- 4
SELECT INSTR('cation', 'o');
-- 5
- POSITION(s1 IN str)
返回子串 s1 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,与LOCATE函数作用相同 - LOCATE(s1, str, p)
从p位置开始向右查找,返回子字符串s1在 str 中第一次出现的位置。如果字符s1不在字符串str中,则返回0。参数p可以不写
SELECT LOCATE('ba', 'foobarba')
-- 4
SELECT LOCATE('xbar', 'foobar')
-- 0
SELECT LOCATE('ba', 'foobarba', 5)
-- 7
- FORMAT(X, n)
将数字X格式化为 ‘#,###,###.##’,四舍五入到n小数位,并将结果作为字符串返回。如果D是 0,则结果没有小数点或小数部分
SELECT FORMAT(12343321.123456, 4)
-- 12,343,321.1235
SELECT FORMAT(12332.2, 0)
-- 12,332
- ELT(n, str1, str2, str3,…)
返回字符串列表的第n个元素: str1if n=1、 str2if n=2等。NULL如果n小于1 或大于参数的数量, 则返回ELT()的补码
SELECT ELT(2, 'www', 'youku', 'com', 'cn')
-- youku
SELECT ELT(3, 'www', 'youku', 'com', 'cn')
-- com
一个没看懂的函数:EXPORT_SET()
https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_export-set
SELECT EXPORT_SET(1, '123', 'abc', 'ABC', 4), EXPORT_SET(2, '123', 'abc', 'ABC', 4), EXPORT_SET(3, '123', 'abc', 'ABC', 4)
-- 123ABCabcABCabcABCabc abcABC123ABCabcABCabc 123ABC123ABCabcABCabc
SELECT EXPORT_SET(4,'Y','N',',',4), EXPORT_SET(5,'Y','N',',',4);
-- N,N,Y,N Y,N,Y,N
SELECT EXPORT_SET(6,'1','0','@',10)
-- 0@1@1@0@0@0@0@0@0@0
一个用处不大的函数:SPACE(N),返回由N 空格字符组成的字符串。例如 SELECT SPACE(5),结果是5个空格
增加
插入
- INSERT(s1, n, len, s2):
在位置n起始的子串且len个字符长的子串由字符串s2代替。 若s2为空字符,结果就变成删除。
SELECT INSERT(12345678, 2, 15, 'asd')
-- 1asd
SELECT INSERT(12345678, 2, 3, 'asd')
-- 1asd5678
SELECT INSERT(12345678, 2, 15, 'asdweqwewq')
-- 1asdweqwewq
SELECT INSERT(12345678, 2, 3, 'asdweqwewq')
-- 1asdweqwewq5678
填充
- LPAD(s1, len, s2):返回字符串s1,其左边由字符串s2填补到len字符长度
- RPAD(s1, len, s2):返回字符串s1,其右边被字符串s2填补至len字符长度
SELECT LPAD('abc', 10, '*')
-- *******abc
SELECT RPAD('abc', 10, '*')
-- abc*******
替换
- 字符串逆序函数REVERSE(s):将字符串s反转,返回的字符串的顺序和s字符顺序相反。
REPEAT(str, n):返回由字符串str重复n次数组成的字符串。如果n小于1,则返回一个空字符串
SELECT REPEAT('CAD', 3)
-- CADCADCAD
REPLACE(str, s1, s2):将str字符串中的s1字符替换成s2。
SELECT REPLACE('aaahuyacn', 'a', 'w')
-- wwwhuywcn
- 比较字符串大小
STRCMP(s1,s2):若所有的字符串均相同,则返回0,若根据当前分类次序,第一个参数小于第二个,则返回-1,其它情况返回1。
删除
删空格
- LTRIM(s) 返回字符串s,字符串左侧空格字符被删除
- RTRIM(s) 返回字符串s,字符串右侧空格字符被删除
- TRIM(s) 返回字符串s,字符串左右两侧空格字符被删除
删内容
TRIM(s1 FROM str):删除字符串str中两端所有的子字符串s1。
SELECT TRIM('a' FROM 'aasvdaaa')
-- svd
SELECT TRIM('xx' FROM 'xxxdexxsdxxxx')
-- xdexxsd
SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
-- 'barxxx'
SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
-- 'bar'
SELECT TRIM(TRAILING 'x' FROM 'xxbarxxxx');
-- 'xxbar'
SELECT INSERT('abcdefg', 3, 4, '')
-- abg
转换
大小写转换
- LOWER (str) 或 LCASE (str):将字符串str中的字母字符全部转换成小写字母。
- UPPER(str) 或 UCASE(str):将字符串str中的字母字符全部转换成大写字母。
进制转换
函数 | 描述 | 实例 | 结果 |
---|---|---|---|
BIN(n) | 将十进制数n,转为二进制的形式 | SELECT BIN(15) | 1111 |
OCT(n) | 将十进制数n,转为八进制的形式 | SELECT OCT(15) | 17 |
HEX(n) | 将十进制数n,转为十六进制的形式 | SELECT HEX(13) | d |
在运用上述函数时,可以加以下前缀符:0b(二进制),0x(十六进制)。(在python中0o代表八进制,但mysql无法识别)
例如:
SELECT HEX(0b101001) 将二进制数101001,转为十六进制,结果为29
SELECT BIN(0x3D) 将十六进制数3D,转为二进制,结果为111101
还有一个综合型的。CONV(str, base, N)
将字符串str由base进制转为N进制。
基数base最小为2,最大为36。如果base是负数,N则视为有符号数。否则,N被视为无符号。CONV()以 64 位精度工作。
-- 二进制转为十进制,结果是:15
SELECT CONV('1111',2,10)
-- 十六进制转为二进制,结果是:1010
SELECT CONV('a',16,2);
-- 十六进制转为八进制,结果是:156
SELECT CONV('6E',16,8);
-- 二进制转为十进制,结果是:51
SELECT CONV('110011',2,10);