MySQL数据库提供针对字符串存储的一种特殊数据类型:集合类型SET,这种数据类型可以给予我们更多提高性能、降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别介绍了布尔类型BOOL或称布尔类型BOOLEAN、枚举类型ENUM,本文我们详细介绍集合类型set测试过程与总结,加深对mysql数据库集合类型set的理解记忆。

n  集合类型 SET

a).数据库表mysqlops_set结构

执行创建数据库表mysqlops_set的语句:

root@localhost : test 05:06:13> CREATE TABLE Mysqlops_SET(ID INT NOT NULL AUTO_INCREMENT,

    ->                            Work_Option  SET('','DBA','SA','Coding Engineer','JavaScript','NA','QA','other') NOT NULL,

    ->                            Work_City    SET('shanghai','beijing','hangzhou','shenzhen','guangzhou','other') NOT NULL DEFAULT 'shanghai',

    ->                            PRIMARY KEY(ID)

    ->                            )ENGINE=InnoDB CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

Query OK, 0 rows affected (0.00 sec)

查阅数据库中创建的mysqlops_set表的结构定义信息:

root@localhost : test 04:33:38> SHOW CREATE TABLE Mysqlops_setG

*************************** 1. row ***************************

       Table: Mysqlops_set

Create Table: CREATE TABLE `Mysqlops_set` (

  `ID` int(11) NOT NULL AUTO_INCREMENT,

  `Work_Option` set('','DBA','SA','Coding Engineer','JavaScript','NA','QA','other') NOT NULL,

  `Work_City` set('shanghai','beijing','hangzhou','shenzhen','guangzhou','other') NOT NULL DEFAULT 'shanghai',

  PRIMARY KEY (`ID`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

小结:

对于集合类型字段定义,MySQL没有做任何强制性转换或修改。

b). 写入不同类型的测试数据

root@localhost : test 05:06:19> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(1,'QA','shanghai');

Query OK, 1 row affected (0.00 sec)

root@localhost : test 05:06:26> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(2,'NA','');

Query OK, 1 row affected (0.00 sec)

root@localhost : test 05:06:33> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(3,'Other',NULL);

ERROR 1048 (23000): Column 'Work_City' cannot be null

root@localhost : test 05:06:47> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(3,'','hangzhou');

Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:06:55> INSERT INTO Mysqlops_SET(ID,Work_City) VALUES(4,'ningbo');

Query OK, 1 row affected, 2 warnings (0.00 sec)

root@localhost : test 05:07:09> SHOW WARNINGS;

+---------+------+--------------------------------------------------+

| Level   | Code | Message                                          |

+---------+------+--------------------------------------------------+

| Warning | 1364 | Field 'Work_Option' doesn't have a default value |

| Warning | 1265 | Data truncated for column 'Work_City' at row 1   |

+---------+------+--------------------------------------------------+

2 rows in set (0.00 sec)
root@localhost : test 05:07:19> INSERT INTO Mysqlops_SET(ID,Work_Option) VALUES(5,'DBA');

Query OK, 1 row affected (0.00 sec)

root@localhost : test 03:06:01> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(6,'DBA','shanghai');

Query OK, 1 row affected (0.00 sec)

root@localhost : test 03:06:10> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(7,'DBA,SA','shanghai,beijing');

Query OK, 1 row affected (0.00 sec)

root@localhost : test 03:06:18> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(8,'DBA,SA,NA','shanghai,beijing,hangzhou');

Query OK, 1 row affected (0.00 sec)

root@localhost : test 03:06:12> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(9,'DBA,SA,NA','shanghai,beijing,hangzhou,shenzhen,guangzhou,other');

Query OK, 1 row affected (0.00 sec)
root@localhost : test 03:18:25> INSERT INTO Mysqlops_SET(ID,Work_Option,Work_City) VALUES(20,'DBA,SA,NA','shanghai,beijing,hangzhou!shenzhen!guangzhou!other');

Query OK, 1 row affected, 1 warning (0.00 sec)

root@localhost : test 03:18:27> show warnings;

+---------+------+------------------------------------------------+

| Level   | Code | Message                                        |

+---------+------+------------------------------------------------+

| Warning | 1265 | Data truncated for column 'Work_City' at row 1 |

+---------+------+------------------------------------------------+

1 row in set (0.00 sec)

小结:

  1. 集合类型SET字段即使没有定义空格字符串作为元素,也会默认成为其中一个组成元素;
  2. 集合类型SET字段不允许为NULL时,向其写入NULL值会报错,导致SQL执行失败;
  3. 集合类型SET字段不允许为NULL且无显式申明默认值时,未集合类型字段给出值的INSERT操作,会出现警告信息,提示字段值阶段,并且用空字符串值替代,SQL语句执行成功;
  4. 集合类型SET字段的值域列表中有空字符串元素时,决断用空字符串值替代的记录,与显式写入空字符串值的序列编号不同,前者序号为0,后者序号为值域列表中真实的顺序;
  5. 向集合类型SET字段写入一个值域列表中,不存在的值,会发生字段值截断,并且用空格字符串替代,SQL语句执行成功;
  6. 集合类型SET字段值域列表中任意元素的组合,只要用逗号分隔,就是合法的值;
  7. 集合类型SET字段值域列表中任意元素的组合时,若部分元素的值没有用逗号分隔,或者部分不是值域列表中元素值或组合,则会把非法的部分截断掉,并且给出警告信息,SQL语句执行成功;

c). 查询数据库表mysqlops_SET的数据

root@localhost : test 03:18:31> select * from mysqlops_SET;

+----+-----------------+----------------------------------------------------+

| ID | Work_Option     | Work_City                                          |

+----+-----------------+----------------------------------------------------+

|  1 | QA              | shanghai                                           |

|  2 | NA              |                                                    |

|  3 |                 | hangzhou                                           |

|  4 |                 |                                                    |

|  5 | DBA             | shanghai                                           |

|  6 | DBA             | shanghai                                           |

|  7 | DBA,SA          | shanghai,beijing                                   |

|  8 | DBA,SA,NA       | shanghai,beijing,hangzhou                          |

|  9 | DBA,SA,NA       | shanghai,beijing,hangzhou,shenzhen,guangzhou,other |

| 10 | Coding Engineer |                                                    |

| 11 | Coding Engineer | shanghai                                           |

| 12 |                 | shanghai                                           |

| 13 |                 | hangzhou                                           |

| 20 | DBA,SA,NA       | shanghai,beijing                                   |

+----+-----------------+----------------------------------------------------+

14 rows in set (0.00 sec)
root@localhost : test 03:07:02> SELECT * FROM mysqlops_set WHERE Work_Option=0;

+----+-------------+-----------+

| ID | Work_Option | Work_City |

+----+-------------+-----------+

|  3 |             | hangzhou  |

|  4 |             |           |

+----+-------------+-----------+

2 rows in set (0.00 sec)
root@localhost : test 03:07:42> SELECT * FROM mysqlops_set WHERE Work_Option=1;

Empty set (0.00 sec)

root@localhost : test 03:07:44> SELECT * FROM mysqlops_set WHERE Work_Option=2;

+----+-------------+-----------+

| ID | Work_Option | Work_City |

+----+-------------+-----------+

|  5 | DBA         | shanghai  |

|  6 | DBA         | shanghai  |

+----+-------------+-----------+

2 rows in set (0.00 sec)

root@localhost : test 03:08:09> SELECT * FROM mysqlops_set WHERE Work_Option=6;

+----+-------------+------------------+

| ID | Work_Option | Work_City        |

+----+-------------+------------------+

|  7 | DBA,SA      | shanghai,beijing |

+----+-------------+------------------+

1 row in set (0.00 sec)

root@localhost : test 03:10:04> SELECT * FROM mysqlops_set WHERE Work_City=0;

+----+-------------+-----------+

| ID | Work_Option | Work_City |

+----+-------------+-----------+

|  2 | NA          |           |

|  4 |             |           |

+----+-------------+-----------+

2 rows in set (0.00 sec)

root@localhost : test 03:10:18> SELECT * FROM mysqlops_set WHERE Work_City=1;

+----+-------------+-----------+

| ID | Work_Option | Work_City |

+----+-------------+-----------+

|  1 | QA          | shanghai  |

|  5 | DBA         | shanghai  |

|  6 | DBA         | shanghai  |

+----+-------------+-----------+

3 rows in set (0.00 sec)

root@localhost : test 03:10:20> SELECT * FROM mysqlops_set WHERE Work_City=2;

Empty set (0.00 sec)

root@localhost : test 03:10:22> SELECT * FROM mysqlops_set WHERE Work_City=3;

+----+-------------+------------------+

| ID | Work_Option | Work_City        |

+----+-------------+------------------+

|  7 | DBA,SA      | shanghai,beijing |

+----+-------------+------------------+

1 row in set (0.00 sec)

root@localhost : test 03:10:24> SELECT * FROM mysqlops_set WHERE Work_City=4;

+----+-------------+-----------+

| ID | Work_Option | Work_City |

+----+-------------+-----------+

|  3 |             | hangzhou  |

+----+-------------+-----------+

1 row in set (0.00 sec)

root@localhost : test 03:10:30> SELECT * FROM mysqlops_set WHERE Work_City=7;

+----+-------------+---------------------------+

| ID | Work_Option | Work_City                 |

+----+-------------+---------------------------+

|  8 | DBA,SA,NA   | shanghai,beijing,hangzhou |

+----+-------------+---------------------------+

1 row in set (0.00 sec)

root@localhost : test 03:13:13> SELECT * FROM mysqlops_set WHERE Work_City=63;

+----+-------------+----------------------------------------------------+

| ID | Work_Option | Work_City                                          |

+----+-------------+----------------------------------------------------+

|  9 | DBA,SA,NA   | shanghai,beijing,hangzhou,shenzhen,guangzhou,other |

+----+-------------+----------------------------------------------------+

1 row in set (0.00 sec)

集合类型SET元素的存储顺序梳理:

l  集合类型字段定义的值域列表信息

集合类型值域列表顺序

值域列表顺序对应的元素值

存储序号二进制编码

二进制编码对应的十进制值

1

shanghai

0000,0001

1

2

beijing

0000,0010

2

3

hangzhou

0000,0100

4

4

shenzhen

0000,1000

8

5

guangzhou

0001,0000

16

6

other

0010,0000

32

l  集合类型字段存储的值

自增序列字段的值

集合类型字段Work_City的值

二进制编码

十进制值

1

shanghai

0000,0001

1

2

空格字符串

0000,0000

0

3

hangzhou

0000,0100

4

4

空格字符串

0000,0000

0

5

shanghai

0000,0001

1

6

shanghai

0000,0001

1

7

Shanghai,beijing

0000,0011

3

8

shanghai,beijing,hangzhou

0000,0111

7

9

shanghai,beijing,hangzhou,shenzhen,guangzhou,other

0011,1111

63

10

空格字符串

0000,0000

0

11

shanghai

0000,0001

1

12

shanghai

0000,0001

1

13

hangzhou

0000,0100

4

20

shanghai,beijing

0000,0011

3

小结:

  1. 出现字段值截断警告提示信息的记录行,对应的字段值都是用空字符串替换掉,且存储序号为0;
  2. 若是集合类型SET字段列表中,元素列表中显式定义空字符串,其存储序列编号也为0;
  3. 通过根据存储序号查询出来的数据,与集合类型SET元素列表顺序、自增序列值大小对比,我们可以得出如下信息:

l  集合类型SET值域列表中,第一个元素的存储顺序编号为:0000,0001;

l  集合类型SET值域列表中,第一个元素之后的元素存储顺序编号为,前一个元素存储序号十进制值的二倍;

l  集合类型SET字段,若存储的数据是值域列表中的元素组合,则是每个元素存储顺序的值相加,则是对应组合值的存储顺序号;

数据类型系列讲解文章列表:
MySQL数据库数据类型之ENUM、SET、BOOL/BOOLEAN、TINYINT特性介绍

MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结

MySQL数据库数据类型之枚举类型ENUM数据测试总结

MySQL数据库之数据类型集合类型和枚举类型测试环境

MySQL数据库之枚举类型ENUM的DDL变更测试

MySQL数据库之集合类型SET的DDL变更测试总结

MySQL数据库之布尔类型、枚举类型和集合类型的应用场景详解

MySQL数据库数据类型之集合类型SET测试总结的更多相关文章

  1. MYSQL数据库数据类型

    07.14自我总结 MYSQL数据库数据类型 一.整数类型和浮点数典型 1.有符号/没符号 对于整数和负整数来说,默认情况下是有符号范围的 默认是有符号 有符号和没符号其实就是有没有包括负数,有符号是 ...

  2. MySQL日期数据类型、时间类型使用总结

    MySQL日期数据类型.时间类型使用总结 MySQL日期数据类型.MySQL时间类型使用总结,需要的朋友可以参考下.   MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型    ...

  3. mysql数据库 --数据类型、约束条件

    今日内容 表的详细使用 1.创建表的完成语法 2.字段类型 整型.浮点型.字符类型.日期类型.枚举与集合类型 3.约束条件 primary key.unique.not null.default 一. ...

  4. MySql数据库数据类型及约束介绍

    1,MySql中数据类型介绍 整型及浮点型 数据类型 存储范围 字节 TINYINT 有符号值:-2^到2^7-1 无符号值:0到2^8-1 2 SMALLINT 有符号值:-2^15到2^15-1 ...

  5. 【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则

    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...

  6. MySQL数据库修改数据表类型(引擎)的方法

    MySQL数据库使用事务,相关数据表必须为InnoDB引擎 查看数据表状态: SHOW TABLE STATUS FROM wawa WHERE NAME='ww_invite_code_temp'; ...

  7. MySQL日期数据类型和时间类型使用总结

    转自: http://blog.chinaunix.net/space.php?uid=11327712&do=blog&id=32416 MySQL 日期类型:日期格式.所占存储空间 ...

  8. MySQL数据库数据类型以及INT(M)的含义

    nt(M)我们先来拆分,int是代表整型数据那么中间的M应该是代表多少位了,后来查mysql手册也得知了我的理解是正确的,下面我来举例说明.   MySQL 数据类型中的 integer types ...

  9. Mysql数据库里面的String类型依照数字来排序以及按时间排序的sql语句

    今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决的方法: 如: SELECT * FROM  Stude ...

随机推荐

  1. 在EF的code frist下写稳健的权限管理系统:仓储设计(三)

    public class BaseRepository<T>:IBaseRepository<T> where T : class { protected EfConnecti ...

  2. 【微网站开发】之微信内置浏览器API使用

    最近在写微网站,发现了微信内置浏览器的很多不称心的地方: 1.安卓版的微信内浏览器底部总是出现一个刷新.前进.后退的底部栏,宽度很大,导致屏幕显示尺寸被压缩 2.分享当前网站至朋友圈时,分享的图片一般 ...

  3. SharePoint 项目的死法(一)

    SharePoint是Microsoft的一个巨NB的产品, 从可查到的数据来看, 财富500强中已经有超过80%的企业已经使用了SharePoint的不同版本,从项目实施的经验来看, 个人感觉这个数 ...

  4. DB2中ixf文件的导入导出

    1. 导出数据 语法:EXPORT TO <文件路径>/文件名.IXF OF IXF SELECT * FROM 表名   2. 导入数据 语法:db2 IMPORT FROM <路 ...

  5. Android里面的命名规范

    前前后后接触安卓也有一段时间了,但是对于Android命名规范这块一直没有太注意过.导致有的时候写出来的代码,前后的风格根本不一样,今天在网上查了一下,正好对自己来说可以好好的总结一下. 首先在And ...

  6. Knockout : 实现复杂的web聊天窗体

    公司以前一个同事写的这个聊天的窗体,由于是采用了html拼接的方式,外加处理的时候没有合理的划分职责,导致页面js代码量非常庞大(1500行左右).现在这哥们离职了,苦的是我们剩下的人,不多说,我先去 ...

  7. [译]AMQP 0-9-1 Quick Reference : basic

    Basic basic.ack(delivery-tag delivery-tag, bit multiple)Support: fullAcknowledge one or more message ...

  8. shell操作文件的几条命令:删除最后一列、删除第一行、diff等

    删除文件第一行: sed '1d' filename 删除文件最后一列: awk '{print $NF}' filename awk删除重复行的命令:awk '{if (!seen[$0]++) { ...

  9. shell 简介

    shell 简介 shell既是一种命令语言,也是一种程序设计语言.作为命令语言,它交互式地解析和执行用户输入的命令:作为程序设计语言,他定义了各种变量和参数,并提供了许多的高级语言才具有的控制结构, ...

  10. curl库 c语言的curl 编程

    c语言的curl 编程 [Linux@centos-64-min exercise]# gcc -Wall -o curltest curltest.c /tmp/ccosVANi.o: In fun ...