视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MYSQLSET字段类型怎么查询
2020-11-09 09:54:25 责编:小采
文档


昨天自己在写一个dedecms功能时突然用到了解dedecms中flag字段,但里面用的是set类型,开始直接查询where = xx 可查出单字符,但是多个是就不好查了,下面我来总结一下set字段查询方法吧。

SET可以包含最多个成员,其值为一个整数。(SET类型基础请查阅 mysql数据类型之set类型 )这个整数的二进制码表示该SET的值的哪些成员为真。例如有`Status` set

代码如下
('ForSale','AuthSuccess','AuditSuccess','IntentionReached','SaleCanceled'),那么它们的值为:
SET member Decimal value Binary value
-----------------------------
ForSale        1       0001
AuthSuccess     2       0010
AuditSuccess    4       0100
IntentionReached  8       1000

如果将9存入Status字段,那么其二进制值为1001,也就是说这个值中'ForSale'和'IntentionReached'为真。
可以想到,如果这样的话,大家可以用LIKE命令和 FIND_IN_SET() 函数来检索SET值:

代码如下
SELECT * FROM tbl_name WHERE Status LIKE '%value%';

SELECT * FROM tbl_name WHERE FIND_IN_SET('value',Status)>0;

当然,以下SQL语句也是合法的,他们显得更加简洁(注意两个成员的顺序及连接符,):

代码如下
SELECT * FROM tbl_name WHERE Status = 'ForSale,IntentionReached';同时我们还可以直接使用数值来查询:
SELECT * FROM tbl_name WHERE Status = 9

因为SET类型的成员的位置都是固定的,数值9永远表示'ForSale'和'IntentionReached'为真;这样即使以后再添加了一个状态,也不会影响之前的查询逻辑。我们再来看看修改SET类型字段的SQL语句使用技巧:
修改Status让其'ForSale'成员为真

代码如下
UPDATE tbl_name SET Status = 1 WHERE Id = 333

修改Status让其'ForSale'、'AuthSuccess'、'IntentionReached' 成员为真

代码如下
UPDATE tbl_name SET Status = 1 | 2 | 4 WHERE Id = 333;

在确认目前状态为7时去掉'ForSale'成员,让7也作为操作的条件是确保目前状态就是为7,如果没有此需求可直接 SET

代码如下
Status = 6 ;
UPDATE tbl_name SET Status = 7 & ~1 WHERE Id = 333;

呵呵,利用SET类型保存权限等数据确实让开发方便清晰了不少哇。

下载本文
显示全文
专题