在工做中,可能须要将某些字段按某个分割符组成一个字符串做为字段值存取到数据库表中,好比某个任务对应三个结果,分别存储在不一样的数据表中,这时能够将这三个不一样表的主键按照约定的顺序进行组合(主键a:主键b:主键c)。当须要分别去查任务对应类别的详情信息时,能够截取特定位置的字符串(主键b) join 表b进行操做。正好最近也遇到这块操做,特地将 MySQL 字符串截取的相关函数作一个梳理,以便从此回顾。mysql
返回字符串 str
自左数的 len
个字符。若是任一参数为 NULL,则返回 NULL。sql
mysql> select left('shinejaie', 5); +---------------------------------------------------------+ | left('shinejaie', 5) | +---------------------------------------------------------+ | shine | +---------------------------------------------------------+ 1 row in set (0.00 sec)
2、right(str, len)
返回 str
右边末 len
位的字符。若是有的参数是 NULL 值,则返回 NULL。strlen
mysql> select right('shinejaie', 4); +---------------------------------------------------------+ | right('shinejaie', 4) | +---------------------------------------------------------+ | jaie | +---------------------------------------------------------+ 1 row in set (0.00 sec)
3、substring_index(str, delim, count)
返回str
中第count
次出现的分隔符delim
以前的子字符串。若是count
为正数,将最后一个分隔符左边(由于是从左数分隔符)的全部内容做为子字符串返回;若是count
为负值,返回最后一个分隔符右边(由于是从右数分隔符)的全部内容做为子字符串返回。在寻找分隔符时,函数对大小写是敏感的。若是在字符串 str 中找不到 delim 参数指定的值,就返回整个字符串。
strcountdelimcountcount
mysql> select substring_index('home.cnblogs.com', '.', 2); +---------------------------------------------------------+ | substring_index('home.cnblogs.com', '.', 2) | +---------------------------------------------------------+ | home.cnblogs | +---------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> select substring_index('home.cnblogs.com', '/', 2); +---------------------------------------------------------+ | substring_index('home.cnblogs.com', '/', 2) | +---------------------------------------------------------+ | home.cnblogs.com | +---------------------------------------------------------+ 1 row in set (0.00 sec)
4、substring() 与 substr() ---> substring(str, pos)、substring(str from pos)、substring(str, pos, len)、substring(str from pos for len)
在以上4种函数变种形式中,没有len
参数的函数形式会返回自str
中位置pos
处以后的子字符串;有len
参数的函数形式会返回自str
中位置pos
处以后,长度为len
的子字符串。使用FROM
的函数形式则是采用的标准的 SQL 语法。pos
参数也可能取负值,在这种状况下,取字符串的方式是从字符串str
的末尾向前(而非从前日后),从这种逆向顺序的pos
处开始取字符串。另外,负值的pos
参数可用于任何形式的substring()
函数中。
lenstrposlenstrposlenFROMposstrpospossubstring()
mysql> select substring('shinejaie', 6); +---------------------------------------------------------+ | substring('shinejaie',6) | +---------------------------------------------------------+ | jaie | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select substr('shinejaie' from 6); +---------------------------------------------------------+ | substr('shinejaie' from 6) | +---------------------------------------------------------+ | jaie | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select substring('shinejaie', -9, 5); +---------------------------------------------------------+ | substring('shinejaie', -9, 5) | +---------------------------------------------------------+ | shine | +---------------------------------------------------------+ 1 row in set (0.00 sec)
5、trim([{both | leading | trailing} [remstr] form] str)
将字符串str
去除remstr
所指定的前缀或后缀,返回结果字符串。若是没有指定标识符both
、leading
,或trailing
,则默认采用both
,即将先后缀都删除。remstr
实际上是个可选参数,若是没有指定它,则删除的是空格。
strremstrbothleadingtrailingbothremstr
mysql> select trim(' shinejaie '); +---------------------------------------------------------+ | trim(' shinejaie ') | +---------------------------------------------------------+ | shinejaie | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select trim(leading 'cn_' from 'cn_shinejaiecn_'); +---------------------------------------------------------+ | trim(leading 'cn_' from 'cn_shinejaiecn_') | +---------------------------------------------------------+ | shinejaiecn_ | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select trim(both 'cn_' from 'cn_shinejaiecn_'); +---------------------------------------------------------+ | trim(both 'cn_' from 'cn_shinejaiecn_') | +---------------------------------------------------------+ | shinejaie | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select trim(trailing 'cn_' from 'cn_shinejaiecn_'); +---------------------------------------------------------+ | trim(trailing 'cn_' from 'cn_shinejaiecn_') | +---------------------------------------------------------+ | cn_shinejaie | +---------------------------------------------------------+ 1 row in set (0.00 sec)