今天在论坛中看到一个关于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. INSERT INTO `string_test` (`id`, `name`, `job`, `sex`, `hobby`) VALUES
  12. (1, 'tank', '农民工', 1, '军棋,游戏,fishing'),
  13. (2, 'zhang', 'DUCK', 0, 'fly,make firend'),
  14. (3, 'ying', 'no job', 1, 'flying,driving,testing'),
  15. (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)

上面我只例举了一部分对字符串进行操作的函数,并且是我觉得我们平时会用的,有可能会用到的一些函数。

本文转自http://www.cnblogs.com/xiangxiaodong/archive/2011/02/21/1959589.html

mysql常用字符串操作函数大全,以及实例的更多相关文章

  1. [转载]c++常用字符串操作函数

    原文地址:c++常用字符串操作函数作者:Valsun 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source ...

  2. C语言的常用字符串操作函数(一)

    一直做的是单片机相关的程序设计,所以程序设计上更偏向底层,对于字符串的操作也仅限于液晶屏幕上的显示等工作,想提高下字符串操作的水平,而不是笨拙的数组替换等方式,翻看帖子发现C语言的字符串操作函数竟然这 ...

  3. PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)

    /*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() 输出格式化字符串 * spri ...

  4. VB常用字符串操作函数

    1. ASC(X),Chr(X):转换字符字符码 [格式]: P=Asc(X) 返回字符串X的第一个字符的字符码 P=Chr(X) 返回字符码等于X的字符 [范例]: (1)P=Chr(65) ‘ 输 ...

  5. string常用字符串操作函数

    1.strdup和strndup 说明:strdup() 函数将参数 s 指向的字符串复制到一个字符串指针上去,这个字符串指针事先可以没被初始化.在复制时,strdup() 会给这个指针分配空间,使用 ...

  6. golang——(strings包)常用字符串操作函数

    (1)func HasPrefix(s, prefix string) bool 判断字符串s是否有前缀字符串prefix: (2)func HasSuffix(s, suffix string) b ...

  7. mysql 常用字符串操作

    SET @L=16, @i=3;SELECT *,CONCAT( LEFT(tag2,@i-1) ,'W', RIGHT(tag2,@L-@i)) from tb_main LIMIT 1,10;

  8. JS 常用字符串操作

    Js字符串操作函数大全 /*******************************************                        字符串函数扩充              ...

  9. [转]MySQL常用Json函数和MySQL常用字符串函数

    MySQL常用Json函数:https://www.cnblogs.com/waterystone/p/5626098.html MySQL常用字符串函数:https://www.cnblogs.co ...

随机推荐

  1. 学习Acegi应用到实际项目中(7)- 缓存用户信息

    在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-failsafe.xml文件所定制 ...

  2. mysql 慢日志分析

    mysql 调优首先需要找到那些有问题的SQL语句. 怎么找到这些语句呢? mysql 提供了很方便的功能. 1.慢日志 在my.cnf 文件中,增加如下配置 log-error            ...

  3. PAT乙级1003

    1003 我要通过! (20 point(s)) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”, ...

  4. 通过shell脚本进行数据库操作

    #!/bin/bash HOSTNAME="192.168.111.84" #数据库信息 PORT=" USERNAME="root" PASSWOR ...

  5. Docker优势以及与传统虚拟机对比(1)

    docker优势 1.更快速地交付和部署: 2.更高的虚拟化(不需要额外的hypervisor支持,是内核级的虚拟化,实现更高的性能呢和效率): 3.更轻松的迁移和扩展: 4.更简单的管理  与传统的 ...

  6. Struts网站基于Filter的XSS漏洞修复

    下面的代码只支持struts2框架中的xss漏洞 第一步,创建过滤器XssFilter : package com.ulic.ulcif.filter; import java.io.IOExcept ...

  7. 安卓端 - H5页面在微信分享、收藏、保存图片不成功

    经过代码实践: 原因是微信在分享.收藏和保存时会获取到图片信息,当图片过大时,造成失败

  8. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

  9. 《设计模式》学习&理解&总结

    教程地址:http://www.runoob.com/design-pattern/design-pattern-tutorial.html 教程书籍:<Android 设计模式解析与实战> ...

  10. Javascript高级编程学习笔记(70)—— 事件(14)内存和性能

    由于事件处理程序是现代的web程序交互能力的提供者 所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据) 在创建GUI(图形用户界面)的语言(如C#) ...