mysql常用字符串操作函數大全,以及實例

轉載自:http://www.cnblogs.com/xiangxiaodong/archive/2011/02/21/1959589.html

今天在論壇中看到一個關於mysql的問題,問題如下

good_id       cat_id
12654         665,569
12655         601,4722

goods_id是商品id
cat_id是分類id
當我,怎麼根據這種分類ID查數據(一個商品有多個分類,而且用逗號隔開了)
我現在用的是like 這樣的話,輸入一個分類id是688,或者4722都能出來這個商品,但輸入一個722也出來這個商品了。

 

如果用like做的話,肯定會有問題的,我的開始的想法是,把cat_id裏面的字符串換成數組,這樣可以利用mysql裏面的in操作,這樣就不會出現查找722,而4722類別下的產品都跑出來了。我從網上找了半天,這方面的字符串操作函數,沒找到,不過我發現了find_in_set這個函數雖然不能,將字符串轉換成數組,但是也不會出現上面的情況。我發現自己有好多函數不知道,所以我從手冊中,以及網上收集了半天,做了一些例子。

一,測試準備

查看複製打印?

  1. 測試表  
  2. CREATE TABLE `string_test` (  
  3.  `id` int(11) NOT NULL auto_increment COMMENT '用戶ID',  
  4.  `name` varchar(50) NOT NULL default '' COMMENT '名稱',  
  5.  `job` varchar(23) NOT NULL COMMENT '工作',  
  6.  `sex` tinyint(1) NOT NULL default '1' COMMENT '性別',  
  7.  `hobby` varchar(100) character set utf8 collate utf8_unicode_ci default NULL COMMENT '愛好',  
  8.  PRIMARY KEY  (`id`)  
  9. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  
  10.   
  11. 測試數據  
  12. INSERT INTO `string_test` (`id`, `name`, `job`, `sex`, `hobby`) VALUES  
  13. (1, 'tank', '農民工', 1, '軍棋,遊戲,fishing'),  
  14. (2, 'zhang', 'DUCK', 0, 'fly,make firend'),  
  15. (3, 'ying', 'no job', 1, 'flying,driving,testing'),  
  16. (4, 'tankzhang', 'love your love', 1, 'i love you');  
測試表
CREATE TABLE `string_test` (
 `id` int(11) NOT NULL auto_increment COMMENT '用戶ID',
 `name` varchar(50) NOT NULL default '' COMMENT '名稱',
 `job` varchar(23) NOT NULL COMMENT '工作',
 `sex` tinyint(1) NOT NULL default '1' COMMENT '性別',
 `hobby` varchar(100) character set utf8 collate utf8_unicode_ci default NULL COMMENT '愛好',
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

測試數據
INSERT INTO `string_test` (`id`, `name`, `job`, `sex`, `hobby`) VALUES
(1, 'tank', '農民工', 1, '軍棋,遊戲,fishing'),
(2, 'zhang', 'DUCK', 0, 'fly,make firend'),
(3, 'ying', 'no job', 1, 'flying,driving,testing'),
(4, 'tankzhang', 'love your love', 1, 'i love you');
id name job sex hobby
1 tank 農民工 1 軍棋,遊戲,fishing
2 zhang DUCK 0 fly,make firend
3 ying no job 1 flying,driving,testing
4 tankzhang love your love 1 i love you

二,mysql字符串操作函數

1,UPPER和UCASE

返回字符串str,根據當前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改變成大寫。該函數對多字節是可靠的。

mysql> select name,UPPER(name) from string_test where name='tank';
+------+-------------+
| name | UPPER(name) |
+------+-------------+
| tank | TANK        |
+------+-------------+
1 row in set (0.00 sec)

2,LOWER和LCASE

返回字符串str,根據當前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改變成小寫。該函數對多字節是可靠的。

mysql> select sex,LCASE(job) from string_test where job='DUCK';
+------+------------+
| sex  | LCASE(job) |
+------+------------+
|    1 | duck       |
+------+------------+
1 row in set (0.00 sec)

3,FIND_IN_SET(str,strlist)

如果字符串str在由N子串組成的表strlist之中,返回一個1到N的值。一個字符串表是被“,”分隔的子串組成的一個字符串。如果第一個參數是一個常數字符串並且第二個參數是一種類型爲SET的列,FIND_IN_SET()函數被優化而使用位運算!如果str不是在strlist裏面或如果 strlist是空字符串,返回0。如果任何一個參數是NULL,返回NULL。如果第一個參數包含一個“,”,該函數將工作不正常。看面是二種不同的效果,可以看一下

mysql> SELECT id,name FROM string_test WHERE find_in_set('fly',hobby);
+----+-------+
| id | name  |
+----+-------+
|  2 | zhang |
+----+-------+
1 row in set (0.00 sec)

mysql> SELECT id,name FROM string_test WHERE hobby like 'fly%';
+----+-------+
| id | name  |
+----+-------+
|  2 | zhang |
|  3 | ying  |
+----+-------+
2 rows in set (0.00 sec)

4,FIELD(str,str1,str2,str3,…)

返回str在str1, str2, str3, …清單的索引。如果str沒找到,返回0。FIELD()是ELT()反運算。

mysql> SELECT id, name, FIELD( id, name, sex, job, hobby )
 -> FROM string_test where id < 4;
+----+-------+------------------------------------+
| id | name  | FIELD( id, name, sex, job, hobby ) |
+----+-------+------------------------------------+
|  1 | tank  |                                  2 |
|  2 | zhang |                                  0 |
|  3 | ying  |                                  0 |
+----+-------+------------------------------------+
3 rows in set (0.00 sec)

5.ELT(N,str1,str2,str3,…)

如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小於1或大於參數個數,返回NULL。ELT()是FIELD()反運算。

mysql> SELECT id, name, ELT(1, id, name, sex, job, hobby ) FROM string_test where id < 4;
+----+-------+------------------------------------+
| id | name  | ELT(1, id, name, sex, job, hobby ) |
+----+-------+------------------------------------+
|  1 | tank  | 1                                  |
|  2 | zhang | 2                                  |
|  3 | ying  | 3                                  |
+----+-------+------------------------------------+
3 rows in set (0.00 sec)

mysql> SELECT id, name, ELT(2, id, name, sex, job, hobby ) FROM string_test where id < 4;
+----+-------+------------------------------------+
| id | name  | ELT(2, id, name, sex, job, hobby ) |
+----+-------+------------------------------------+
|  1 | tank  | tank                               |
|  2 | zhang | zhang                              |
|  3 | ying  | ying                               |
+----+-------+------------------------------------+
3 rows in set (0.00 sec)

6,REPLACE(str,from_str,to_str)

返回字符串str,其字符串from_str的所有出現由字符串to_str代替。

mysql> SELECT id,REPLACE(hobby,"firend",'living') FROM string_test WHERE id = 2;

+----+----------------------------------+
| id | REPLACE(hobby,"firend",'living') |
+----+----------------------------------+
|  2 | fly,make living                  |
+----+----------------------------------+
1 row in set (0.00 sec)

7,REPEAT(str,count)

返回由重複countTimes次的字符串str組成的一個字符串。如果count <= 0,返回一個空字符串。如果str或count是NULL,返回NULL。

mysql> SELECT id,REPEAT(name,2) FROM string_test WHERE id > 1 and id < 4;
+----+----------------+
| id | REPEAT(name,2) |
+----+----------------+
|  2 | zhangzhang     |
|  3 | yingying       |
+----+----------------+
2 rows in set (0.00 sec)

8,REVERSE(str)

返回顛倒字符順序的字符串str。

 mysql> SELECT id,reverse(name) FROM string_test WHERE id > 1 and id < 4;
+----+---------------+
| id | reverse(name) |
+----+---------------+
|  2 | gnahz         |
|  3 | gniy          |
+----+---------------+
2 rows in set (0.00 sec)

9,INSERT(str,pos,len,newstr)

返回字符串str,在位置pos起始的子串且len個字符長得子串由字符串newstr代替。

mysql> select id,name,INSERT(hobby,10,6,'living') from string_test where id = 2;

+----+-------+-----------------------------+
| id | name  | INSERT(hobby,10,6,'living') |
+----+-------+-----------------------------+
|  2 | zhang | fly,make living             |
+----+-------+-----------------------------+
1 row in set (0.00 sec)

10,SUBSTRING(str FROM pos)

從字符串str的起始位置pos返回一個子串。下面的sub2沒有值,因爲mysql數據庫的下標是從1開始的。

mysql> SELECT id, substring( hobby, 1, 6) AS sub1, substring( hobby from 0 for 8
 ) AS sub2,substring( hobby,2) AS sub3, substring( hobby from 4 ) AS sub4 FROM s
tring_test WHERE id =4;
+----+--------+------+-----------+---------+
| id | sub1   | sub2 | sub3      | sub4    |
+----+--------+------+-----------+---------+
|  4 | i love |      |  love you | ove you |
+----+--------+------+-----------+---------+
1 row in set (0.00 sec)

11,SUBSTRING_INDEX(str,delim,count)

返回從字符串str的第count個出現的分隔符delim之後的子串。如果count是正數,返回最後的分隔符到左邊(從左邊數) 的所有字符。如果count是負數,返回最後的分隔符到右邊的所有字符(從右邊數)。

mysql> SELECT id,SUBSTRING_INDEX(hobby,',',2) as test1,SUBSTRING_INDEX(hobby,','
,-1) as test2 FROM string_test WHERE id = 3;
+----+----------------+---------+
| id | test1          | test2   |
+----+----------------+---------+
|  3 | flying,driving | testing |
+----+----------------+---------+
1 row in set (0.01 sec)

12,LTRIM(str)

返回刪除了其前置空格字符的字符串str。

mysql> SELECT id,LTRIM(job) FROM string_test WHERE id = 4;
+----+----------------+
| id | LTRIM(job)     |
+----+----------------+
|  4 | love your love |
+----+----------------+
1 row in set (0.00 sec)

13,RTRIM(str)

返回刪除了其拖後空格字符的字符串str。

mysql> SELECT id,RTRIM(job) FROM string_test WHERE id = 4;
+----+----------------+
| id | RTRIM(job)     |
+----+----------------+
|  4 | love your love |
+----+----------------+
1 row in set (0.00 sec)

14,TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

返回字符串str,其所有remstr前綴或後綴被刪除了。如果沒有修飾符BOTH、LEADING或TRAILING給出,BOTH被假定。如果remstr沒被指定,空格被刪除。

mysql> select trim(' test  ');
+-----------------+
| trim(' test  ') |
+-----------------+
| test            |
+-----------------+
1 row in set (0.01 sec)

mysql> SELECT id,TRIM(LEADING "love" from job) as test1,TRIM(BOTH "love" from jo
b) as test2,TRIM(TRAILING "love" from job) as test3 FROM string_test WHERE id =
4
 -> ;
+----+------------+--------+------------+
| id | test1      | test2  | test3      |
+----+------------+--------+------------+
|  4 |  your love |  your  | love your  |
+----+------------+--------+------------+
1 row in set (0.00 sec)

15,MID(str,pos,len)

從字符串str返回一個len個字符的子串,從位置pos開始。使用FROM的變種形式是ANSI SQL92語法。

mysql>  SELECT id, mid( hobby, 1, 6 ) AS sub1, mid( hobby
 -> FROM 0
 -> FOR 8 ) AS sub2, mid( hobby, 2 ) AS sub3, mid( hobby
 -> FROM 4 ) AS sub4
 -> FROM string_test
 -> WHERE id =4 ;
+----+--------+------+-----------+---------+
| id | sub1   | sub2 | sub3      | sub4    |
+----+--------+------+-----------+---------+
|  4 | i love |      |  love you | ove you |
+----+--------+------+-----------+---------+
1 row in set (0.00 sec)

mysql>

16,LPAD(str,len,padstr)

返回字符串str,左面用字符串padstr填補直到str是len個字符長。

mysql> SELECT id,LPAD(name,11,"zhang ") FROM string_test WHERE id = 3;
+----+------------------------+
| id | LPAD(name,11,"zhang ") |
+----+------------------------+
|  3 | zhang zying            |
+----+------------------------+
1 row in set (0.00 sec)

17,RPAD(str,len,padstr)

返回字符串str,右面用字符串padstr填補直到str是len個字符長。

mysql> SELECT id,RPAD(name,11," ying") FROM string_test WHERE id = 2;
+----+-----------------------+
| id | RPAD(name,11," ying") |
+----+-----------------------+
|  2 | zhang ying            |
+----+-----------------------+
1 row in set (0.00 sec)

18,LEFT(str,len)

返回字符串str的最左面len個字符。

mysql> SELECT id,left(job,4) FROM string_test WHERE id = 4;
+----+-------------+
| id | left(job,4) |
+----+-------------+
|  4 | love        |
+----+-------------+
1 row in set (0.00 sec)

19,RIGHT(str,len)

返回字符串str的最右面len個字符。

mysql> SELECT id,right(job,4) FROM string_test WHERE id = 4;
+----+--------------+
| id | right(job,4) |
+----+--------------+
|  4 | love         |
+----+--------------+
1 row in set (0.00 sec)

20,位置控制函數

POSITION(substr IN str)
返回子串substr在字符串str第一個出現的位置,如果substr不是在str裏面,返回0.

LOCATE(substr,str,pos)
返回子串substr在字符串str第一個出現的位置,從位置pos開始。如果substr不是在str裏面,返回0。

INSTR(str,substr)
返回子串substr在字符串str中的第一個出現的位置。這與有2個參數形式的LOCATE()相同,除了參數被顛倒。

mysql> SELECT id,INSTR(job,"you") as instr,LOCATE('love',job,3) as locate,POSITI
ON('love' in job) as position FROM string_test WHERE id = 4;
+----+-------+--------+----------+
| id | instr | locate | position |
+----+-------+--------+----------+
|  4 |     6 |     11 |        1 |
+----+-------+--------+----------+
1 row in set (0.00 sec)

21,得到字符串長度的函數

LENGTH(str),OCTET_LENGTH(str),CHAR_LENGTH(str),CHARACTER_LENGTH(str)

mysql> SELECT id,LENGTH(job) as one,OCTET_LENGTH(job) as two,CHAR_LENGTH(job) as
 three,CHARACTER_LENGTH(job) as four FROM string_test WHERE id = 4;
+----+-----+-----+-------+------+
| id | one | two | three | four |
+----+-----+-----+-------+------+
|  4 |  14 |  14 |    14 |   14 |
+----+-----+-----+-------+------+
1 row in set (0.00 sec)

22,合併多個字符串,或者表中的多個字段

CONCAT(str1,str2,…)

返回來自於參數連結的字符串。如果任何參數是NULL,返回NULL。可以有超過2個的參數。一個數字參數被變換爲等價的字符串形式。

mysql> SELECT id,CONCAT(name,job,hobby) FROM string_test WHERE id = 4;
+----+-----------------------------------+
| id | CONCAT(name,job,hobby)            |
+----+-----------------------------------+
|  4 | tankzhanglove your lovei love you |
+----+-----------------------------------+
1 row in set (0.00 sec)

23,進制轉換

BIN(N)
返回二進制值N的一個字符串表示,在此N是一個長整數(BIGINT)數字,這等價於CONV(N,10,2)。如果N是NULL,返回NULL。

OCT(N)
返回八進制值N的一個字符串的表示,在此N是一個長整型數字,這等價於CONV(N,10,8)。如果N是NULL,返回NULL。

HEX(N)
返回十六進制值N一個字符串的表示,在此N是一個長整型(BIGINT)數字,這等價於CONV(N,10,16)。如果N是NULL,返回NULL。

ASCII(str)
返回字符串str的最左面字符的ASCII代碼值。如果str是空字符串,返回0。如果str是NULL,返回NULL。

mysql> select bin(20),oct(20),hex(20),ascii(20);
+---------+---------+---------+-----------+
| bin(20) | oct(20) | hex(20) | ascii(20) |
+---------+---------+---------+-----------+
| 10100   | 24      | 14      |        50 |
+---------+---------+---------+-----------+
1 row in set (0.02 sec)

上面我只例舉了一部分對字符串進行操作的函數,並且是我覺得我們平時會用的,有可能會用到的一些函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章