在工做中,可能須要將某些字段按某個分割符組成一個字符串做爲字段值存取到數據庫表中,好比某個任務對應三個結果,分別存儲在不一樣的數據表中,這時能夠將這三個不一樣表的主鍵按照約定的順序進行組合(主鍵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)