-- Adminer 4.3.1 MySQL dump

SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `xtest_keyid_ys`;
CREATE TABLE `xtest_keyid_ys` (
  `kid` varchar(24) NOT NULL,
  `kno` int(11) NOT NULL DEFAULT '0',
  `content` varchar(254) NOT NULL DEFAULT '',
  `aip` varchar(255) DEFAULT '',
  `atime` int(11) NOT NULL DEFAULT '0',
  `auser` varchar(24) NOT NULL DEFAULT '',
  `test_v3x` int(11) NOT NULL DEFAULT '20160313',
  `aa` float NOT NULL DEFAULT '0',
  `AA12` float NOT NULL DEFAULT '0',
  `BB22` text NOT NULL,
  `items` enum('e1','e2','e3','e4','es') NOT NULL,
  `sets` set('s1','s2','s3','s4','sa') NOT NULL,
  PRIMARY KEY (`kid`),
  KEY `sets` (`sets`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `xtest_keyid_ys` (`kid`, `kno`, `content`, `aip`, `atime`, `auser`, `test_v3x`, `aa`, `AA12`, `BB22`, `items`, `sets`) VALUES
('b1', 2, 'b3', 'b4', 5, '6', 7, 8, 9, 'b10', 'e3', 's2,s4'),
('c1', 2, 'c3', 'c4', 5, '6', 7, 8, 9, 'c10', 'e1', 's3,sa'),
('d1', 2, 'd3', 'd4', 5, '6', 7, 8, 9, 'd10', 'e1', 's1'),
('e1', 2, 'e3', 'e4', 5, '6', 7, 8, 9, 'e10', 'e1', 's2'),
('a1', 2, 'a3', 'e4', 5, '6', 7, 8, 9, 'a10', 'e1', 's2,s3,s4');

-- 2018-02-05 04:01:06

========================================================

UPDATE xtest_keyid_ys SET sets='a' WHERE kid='a1'; -- 无效
UPDATE xtest_keyid_ys SET sets='s2' WHERE kid='a1'; -- ok
UPDATE xtest_keyid_ys SET sets='6' WHERE kid='a1'; -- ok
UPDATE xtest_keyid_ys SET sets=7 WHERE kid='a1'; -- ok
UPDATE xtest_keyid_ys SET sets='s2,s3,s4' WHERE kid='a1'; -- ok
UPDATE xtest_keyid_ys SET sets='s4,s2,s3' WHERE kid='a1'; -- ok
结果其实是:s2,s3,s4(14)

* 搜索多个
SELECT * FROM xtest_keyid_ys WHERE sets=10; -- ok,但要换算
SELECT * FROM xtest_keyid_ys WHERE sets=20; -- ok,但要换算
SELECT * FROM xtest_keyid_ys WHERE sets=14; -- ok,但要换算

SELECT * FROM xtest_keyid_ys WHERE sets='s2,s4'; -- ok,顺序要一致
SELECT * FROM xtest_keyid_ys WHERE sets='s3,sa'; -- ok,顺序要一致
SELECT * FROM xtest_keyid_ys WHERE sets='s2,s3,s4'; -- ok,顺序要一致

* 搜索单个
SELECT * FROM xtest_keyid_ys WHERE sets IN('s2','s4'); -- ok,只找其中一个,不是组合
SELECT * FROM xtest_keyid_ys WHERE sets IN('s3','sa'); -- ok,只找其中一个,不是组合
SELECT * FROM xtest_keyid_ys WHERE sets IN('s2','s3','s4'); -- ok,只找其中一个,不是组合

* 用不了索引
SELECT * FROM xtest_keyid_ys WHERE sets&2=2;

SELECT * FROM xtest_keyid_ys WHERE sets='s4,s2'; -- xx,交换文字不行
SELECT * FROM xtest_keyid_ys WHERE sets='sa,s3'; -- xx,交换文字不行
SELECT * FROM xtest_keyid_ys WHERE sets='s2,a,s4'; -- xx,交换文字不行

例如查询3月份的景点,可使用以下语句:
SELECT *FROM`spots`WHERE`month`&4=4

SELECT * FROM xtest_keyid_ys WHERE sets&2=2; -- ok,顺序要一致

http://bbs.csdn.net/topics/360124723
mysql中set类型字段怎样进行位运算和索引?



========================================================


mysql中的数据类型enum和set
https://www.cnblogs.com/benbenzhu/p/5604598.html

mysql中的数据类型enum和set

1、enum

  单选字符串数据类型,适合存储表单界面中的“单选值”。

  设定enum的时候,需要给定“固定的几个选项”;存储的时候就只存储其中的一个值。

  设定enum的格式:

    enum("选项1","选项2","选项3",...);

  实际上,enum的选项都会对应一个数字,依次是1,2,3,4,5...,最多有65535个选项

  使用的时候,可以使用选项的字符串格式,也可以使用对应的数字。

2、set

  多选字符串数据类型,适合存储表单界面的“多选值”。

  设定set的时候,同样需要给定“固定的几个选项”;存储的时候,可以存储其中的若干个值。

  设定set的格式:

    set("选项1","选项2","选项3",...)

  同样的,set的每个选项值也对应一个数字,依次是1,2,4,8,16...,最多有64个选项

  使用的时候,可以使用set选项的字符串本身(多个选项用逗号分隔),也可以使用多个选项的数字之和(比如:1+2+4=7)