我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。
上一章简单介绍了 MySQL的数学函数(十),如果没有看过,请观看上一章
一 . MySQL的字符串函数表
MySQL的字符串函数,与Java 中的字符串函数所提供的功能差不多。 MySQL的字符串函数,是非常重要的。
函数名 | 解释 | 例子 |
char_length(s1) | 字符个数 | char_length(‘1234’) |
character_length(s1) | 字符个数 | character_length(‘1234’) |
length(s1) | 字符串的字节长度 | length(‘abc123’) |
concat(s1,s2,s3…) | 连接字符串 | concat(‘a’,‘b’,‘c’) |
concat_ws(x,s1,s2,s3…) | 拼接字符串 | concat_ws(’,’,‘a’,‘b’,‘c’) |
insert(s1,index,len,s2) | 替换字符串 | insert(‘abcd’,2,2,‘ef’) |
lower(s1) | 转小写 | lower(‘Abd’) |
lcase(s1) | 转小写 | lcase(‘Abc’) |
upper(s1) | 转大写 | upper(‘Abd’) |
ucase(s1) | 转大写 | ucase(‘Abc’) |
left(str1,n) | 获取最左边的字符串 | left(‘abcdefg’,‘3’) |
right(str1,n) | 获取最右边的字符串 | right(‘abcdefg’,4) |
lpad(s1,len,s2) | 填充左边 | lpad(‘abc’,10,’*’) |
rpad(s1,len,s2) | 填充右边 | rpad(‘abc’,10,’*’) |
ltrim(s1) | 左边去除空格 | ltrim(’ abc’) |
rtrim(s1) | 右边去除空格 | rtrim('abc ') |
trim(s1) | 去除左右两边的空格 | trim(’ abc ') |
trim(s1 from s2) | 删除指定的字符串 | trim(‘abc’ from ‘abcdefgd’) |
repeat(s1,n) | 重复生成n个字符串 | repeat(‘a’,10) |
space(n) | 重复生成n个空格 | space(10) |
replace(s1,s2,s3) | 替换全部的字符串 | replace(‘abbaedfg’,‘b’,‘d’) |
strcmp(s1,s2) | 比较字符串s1,s2的大小 | strcmp(‘abc’,‘abd’) |
substr(s1,index,len) | 截取字符串 | substr(‘abcdefg’,2,5) |
substring(s1,index,len) | 截取字符串 | substring(‘abcdefg’,2,5) |
mid(s1,index,len) | 截取字符串 | mid(‘abcdefg’,2,5) |
substring_index(str1,delimiter,num) | 从第num处开始截取 | substring_index(‘192.168.1.101’,’.’,2) |
reverse(s1) | 反转字符串 | reverse(‘dcba’) |
instr(s1,s2) | s2在s1中最开始出现的位置 | instr(‘abcde’,‘bc’) |
locate(s2,s1) | s2在s1中最开始出现的位置 | locate(‘bc’,‘abcde’) |
position(s2 in s1) | s2在s1中最开始出现的位置 | position(‘bc’,‘abcde’) |
elt(n,s1,s2,s3…) | 指定位置的字符串 | elt(1,‘a’,‘b’,‘c’) |
field(s,s1,s2,s3…) | 指定字符串所处的位置 | field(‘a’,‘a’,‘b’,‘c’) |
find_in_set(s1,s2) | s1在s2中的位置 | find_in_set(‘a’,‘b,a,c,d,e’) |
make_set(x,s1,s2,s3…) | 二进制选择字符串 | make_set(5,‘a’,‘b’,‘c’) |
format(n,d,locale) | 格式化数字型字符串 | format(‘1234’,2) |
ascii(s1) | s1的第一个字符的ascii码 | ascii(‘ab’) |
二. MySQL字符串函数
二.一 字符个数函数 char_length(s1),character_length(s1)
其中,一个多字节字符,如中文,算是一个字符。
char_length() 与character_length() 函数意义一样。
select char_length('1234'),char_length('abc123'),char_length('岳泽霖'),char_length('abc岳泽霖');
二.二 字符串的字节长度 length(s1)
一个中文字符,是utf-8 编码,是3个. gbk编码,是2个. 老蝴蝶用的是gbk编码。
select length('1234'),length('abc123'),length('岳泽霖'),length('abc岳泽霖');
二.三 连接字符串 concat(s1,s2,s3…)
连接的时候,是直接拼接,为s1+s2+s3+… 如果列表里面有任意一个值为 null,那么就返回null.
select concat('1','2','3'),concat('abc','123'),concat('岳','泽霖'),concat('两个','蝴蝶飞'),concat('abc',null,'123');
二.四 拼接字符串 concat_ws(x,s1,s2,s3…)
concat_ws, 就是 concat_with separator, 用分隔符连接。 是 s1+x+s2+x+s3+x…
拼接最后时,没有分隔符。 如果分隔符x为null,那么就返回null. 如果列表里面有Null值,就忽略那个为null的值。
常用的是, 进行连接。 如拼接 in语句时。
select concat_ws(',','abc','123'),concat_ws('_','两个','蝴蝶','飞'),concat_ws('*','岳','泽',null,'霖');
二.五 替换字符串 insert(s1,index,len,s2)
将 s1字符串, 从index位置开始,len长度的 那个字符串,用s2进行代替。
MySQL默认是从1开始的。 如果 len长度过大,超过了 char_length(s1)-x, 那么就截取后面的全部数据。
select insert('abc123',1,3,'eee'),insert('两个蝴蝶飞',2,3,'岳泽霖'),insert('两个蝴蝶飞',2,10,'岳泽霖');
二.六 转小写 lower(s1),lcase(s1)
将 s1字符串转换成小写。 如果是中文的话,那么还是中文。 lower(s1)与 lcase(s1) 用法是一样的。
select lower('abc123'),lower('AbcDef'),lower('123'),lower('两个蝴蝶飞');
二.七 转大写 upper(s1),ucase(s1)
将s1 字符串转换成大写。 upper(s1) 与ucase() 用法是一样的。
select upper('abc123'),upper('aEdBc'),upper('两个蝴蝶飞');
二.八 获取最左边n长度的字符串 left(s1,n)
将s1字符串,从左边数 n个长度,返回。 如果n 数值大于 char_length(s1),就全部提取。
select left('abc123',3),left('两个蝴蝶飞',4),left('岳泽霖',10);
二.九 获取最右边n长度的字符串 right(s1,n)
将s1字符串,从右边数n个长度,返回。 如果n数值大于 char_length(s1),就全部提取返回。
select right('abc123',3),right('两个蝴蝶飞',4),right('岳泽霖',10);
二.十 填充左边部分 LPAD(s1,len,s2)
对于s1字符串,如果char_length(s1)<len, 那么就在s1字符串左边连续填充字符串s2, 使填充后的字符串的长度为len.
如果 char_length(s1)>=len, 那么就从 s1字符串的左边截取len个长度的字符串,使长度变成len.
select lpad('abc123',4,'**'),lpad('abc123',6,'**'),lpad('两个蝴蝶飞',20,'*');
二.十一 填充右边部分 RPAD(s1,len,s2)
对于s1字符串,如果char_length(s1)<len, 那么就在s1字符串右边连续填充字符串s2, 使填充后的字符串的长度为len.
如果 char_length(s1)>=len, 那么就从 s1字符串的左边截取len个长度的字符串,使长度变成len.
select rpad('abc123',4,'**'),rpad('abc123',6,'**'),rpad('两个蝴蝶飞',20,'*');
二.十二 删除空格 ltrim(s1),rtrim(s2),trim(s3)
ltrim() 删除的是左边的空格, rtrim() 删除的是右边的空格, trim()删除的是左右两边的空格。 但不能删除中间的空格。
不太好注意看, 用concat()函数,左右两边各连接一个 1,方便查看。
select concat('1',' 两个蝴蝶飞 ','1'),concat('1',ltrim(' 两个蝴蝶飞 '),'1'),
concat('1',rtrim(' 两个蝴蝶飞 '),'1'),concat('1',trim(' 两个 蝴蝶飞 '),'1');
二.十三 删除指定的字符串 trim(s1 from s2)
将s2字符串,如果左右两边的开头是s1的话,就删除s1字符串。 如果s1不指定的话,就默认删除空格。 trim(s3) 实际上就是 trim(’ ’ from s3). 不能删除中间的。 删除时,也不是只删除一次,如果s2删除掉s1之后,发现开头和结尾还是s1,那么会继续删除的。
select trim('ab' from 'abc1234ab'),trim('ab' from 'ababab123abab3dabab'),trim(' ' from ' 两个蝴蝶飞 ');
二.十四 重复生成字符串 repeat(s1,n)
生成 n个s1字符串,将它进行连接。 如果 n<=0,返回空字符串, 如果 s1或者n为null,那么返回 null.
select repeat('两个蝴蝶飞',3),repeat('abc',0),repeat(null,3),repeat('abc',null);
二.十五 空格函数 space(n)
生成 n个空格,相当于 repeat(’’,n). 是repeat()的一种特殊形式。
select concat('(',space(10),')'),char_length(space(10));
二.十六 替换字符串 replace(s1,s2,s3)
在 s1字符串中, 如果存在s2字符串,那么就将s2字符串替换为s3字符串。 注意,是全部替换。 如果s1里面,没有s2字符串,那么就不替换,仍然返回s1字符串。
select replace('abcd','ab','cd'),replace('ababCdabEfab','ab','cd'),replace('cdefg','ab','cd');
二.十七 比较字符串大小 strcmp(s1,s2)
strcmp 实际就是 string+compare
如果s1==s2, 就返回0. 如果s1<s2,就返回-1, s1>s2,就返回1. 按照ASCII码进行比较, 不区分大小写。
select strcmp('abc','Abc'),strcmp('abc','abcd'),strcmp('abc','abc'),strcmp('abc123','123');
二.十八 字符串截取 substr(str,index,len), substring(str,index,len) 和mid(str,index,len)
截取字符串。 三者的使用方式是一样的。
如果有两个参数, substr(str,index), 表示从 index处开始截取,到最后结束。
如果有三个参数, substr(str,index,len), 表示从index处开始截取,只截取 len个长度。
截取的顺序,都是从左往右截取。 其中,index可以为正,也可以为负,为负表示从后往前数。
如果 len<=0, 那么返回的是空字符串。
mysql 默认开始的位置是1.
select substr('abcdefg',3),substring('abcdefg',3,3), substring('abcdefg',-5), substring('abcdefg',-5,4);
‘abcdefg’, 正数第3个,是 c. 倒数第5个是,c
二.十九 字符串从开始位置截取 substring_index(str,delimiter,num)
截取字符串 str, 从第 num位置开始的, 以delimiter 进行截取。 如果num 为正数,就截取后展示左边的全部内容。
如果num为负数,就倒着截取,然后展示右边的全部内容。 注意,都不包括分隔符这个内容。
如果str字符串里面没有这个分隔符,就返回str
如一个ip 地址, 192.168.1.101 进行截取。
select substring_index('192.168.1.101','.',1) as 'a',substring_index('192.168.1.101','.',3) as 'b',
substring_index('192.168.1.101','.',-1) as 'c',substring_index('192.168.1.101','.','-2') as 'd',
substring_index('192.168.1.101','+',1) as 'e',substring_index('192.168.1.101','+',-1) as 'f';
二.二十 字符串反转 reverse(s1)
将字符串反转
select reverse('abcdefg'),reverse('两个蝴蝶飞'),reverse('1234321');
二.二十一 最开始出现子字符串的位置 instr(str1,str2), locate(str2,str1) 与 position(str2 in str1)
三者的作用是一样的,都是查询子字符串最先出现的位置。
注意,str1与str2的位置。 instr与 java中的相同, locate() 与position的顺序正好相反。
如果没有找到,返回 0. 不是传说中的-1.
select instr('abcde','bcd'),locate('a','abcdefg'),position('cd' in 'abdefg');
二.二十二 指定位置的字符串 ELT(n,str1,str2,str3…)
如果n=1, 就返回str1, n=2 返回 str2, n=3返回str3, 如果n<=0,那么返回null, 如果n> 列表的字符串数目, 也返回null
select elt(1,'a','b','c'),elt(2,'ab','bcd','c'),elt(0,'ab','ad');
二.二十三 指定字符串的位置 FIELD(s,s1,s2,s3…)
如果s=s1,就返回1, 如果s=s2,就返回2, 如果s=s3 就返回3, 如果找不到,就返回0. 如果s为null, 那么也返回0. 0表示没有找到。
select field('a','abc','a','ac'), field('ab','ab','abc','ab'),field('a','ab','b','c'),field(null,'a','b');
二.二十四 集合子串的位置 find_in_set(s1,s2)
s2 是一个字符串,用, 进行拼接的。 如果s2为null,如果没有找到s1,就返回0. 如果s1中值为null,就返回null.
select find_in_set('abc','a,abc,abc,ac,bc'),find_in_set('a','a,b,c,d'),
find_in_set('a','ab,ac,ad'),find_in_set('a','a,null,b,ab'),
find_in_set('a','null,a,b,ab'),find_in_set(null,'null,ac,b,ab');
注意,并不是s2中有值为null,就直接返回null了。
二.二十五 选择字符串 make_set(x,s1,s2,s3…)
首先将 数值x 变成二进制数, 将列表值按照 s1,s2,s3…的顺序排序。 变成的二进制数依次排列,如果是1,就取出来,如果是0,就跳过。 取出来的值,如果是null,就跳过不管。
select make_set(1,'abc','a','b'),make_set(3,'a','c','b'),make_set(5,'a','c','b','d'),
make_set(5,'a','b',null,'c');
1 二进制是 1, 放置在 ‘abc’,‘a’,‘b’ 里面, 取出 第一个 ‘abc’
3 二进制是11, 放置在 ‘a’,‘c’,‘b’, 取出 第一个a,和第二个c, 为 a,c
5 二进制是101, 放置在 ‘a’,‘c’,‘b’,‘d’, 取出第一个 a, 第二位是0,不取出, 第三位是1, 取出第三位的b, 为a,b
5 二进制是101, 放置在 ‘a’,‘b’,null,‘c’ ,取出第一个a,第二位是0,不取出, 第三位是1,取出null, 但null值跳过,不取,所以为 a.
二.二十六 格式化函数 format(n,d,locale)
locale默认是 ‘en_us’ . d 表示的是小数点位数。
将一个数值类型的数,格式化保留几位小数。 以###,###.## 的形式展示, 千分位展示。
n 即可以是数值类型,也可以是 数值的字符串。
select format(23,2),format('12345',3),format('123455',2),format(123455,2);
二.二十七 ASCII 码函数 ascii(s1)
字符串s1的第一个字符的 ascii码的值。只算第一个字符值。
select ascii('abc'),ascii('a'),ascii('A');
谢谢!!!