MySQL数据库数据类型之集合类型SET测试总结
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)
小结:
- 集合类型SET字段即使没有定义空格字符串作为元素,也会默认成为其中一个组成元素;
- 集合类型SET字段不允许为NULL时,向其写入NULL值会报错,导致SQL执行失败;
- 集合类型SET字段不允许为NULL且无显式申明默认值时,未集合类型字段给出值的INSERT操作,会出现警告信息,提示字段值阶段,并且用空字符串值替代,SQL语句执行成功;
- 集合类型SET字段的值域列表中有空字符串元素时,决断用空字符串值替代的记录,与显式写入空字符串值的序列编号不同,前者序号为0,后者序号为值域列表中真实的顺序;
- 向集合类型SET字段写入一个值域列表中,不存在的值,会发生字段值截断,并且用空格字符串替代,SQL语句执行成功;
- 集合类型SET字段值域列表中任意元素的组合,只要用逗号分隔,就是合法的值;
- 集合类型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 |
小结:
- 出现字段值截断警告提示信息的记录行,对应的字段值都是用空字符串替换掉,且存储序号为0;
- 若是集合类型SET字段列表中,元素列表中显式定义空字符串,其存储序列编号也为0;
- 通过根据存储序号查询出来的数据,与集合类型SET元素列表顺序、自增序列值大小对比,我们可以得出如下信息:
l 集合类型SET值域列表中,第一个元素的存储顺序编号为:0000,0001;
l 集合类型SET值域列表中,第一个元素之后的元素存储顺序编号为,前一个元素存储序号十进制值的二倍;
l 集合类型SET字段,若存储的数据是值域列表中的元素组合,则是每个元素存储顺序的值相加,则是对应组合值的存储顺序号;
数据类型系列讲解文章列表:
MySQL数据库数据类型之ENUM、SET、BOOL/BOOLEAN、TINYINT特性介绍
MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结
MySQL数据库之布尔类型、枚举类型和集合类型的应用场景详解
MySQL数据库数据类型之集合类型SET测试总结的更多相关文章
- MYSQL数据库数据类型
07.14自我总结 MYSQL数据库数据类型 一.整数类型和浮点数典型 1.有符号/没符号 对于整数和负整数来说,默认情况下是有符号范围的 默认是有符号 有符号和没符号其实就是有没有包括负数,有符号是 ...
- MySQL日期数据类型、时间类型使用总结
MySQL日期数据类型.时间类型使用总结 MySQL日期数据类型.MySQL时间类型使用总结,需要的朋友可以参考下. MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 ...
- mysql数据库 --数据类型、约束条件
今日内容 表的详细使用 1.创建表的完成语法 2.字段类型 整型.浮点型.字符类型.日期类型.枚举与集合类型 3.约束条件 primary key.unique.not null.default 一. ...
- MySql数据库数据类型及约束介绍
1,MySql中数据类型介绍 整型及浮点型 数据类型 存储范围 字节 TINYINT 有符号值:-2^到2^7-1 无符号值:0到2^8-1 2 SMALLINT 有符号值:-2^15到2^15-1 ...
- 【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则
MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...
- MySQL数据库修改数据表类型(引擎)的方法
MySQL数据库使用事务,相关数据表必须为InnoDB引擎 查看数据表状态: SHOW TABLE STATUS FROM wawa WHERE NAME='ww_invite_code_temp'; ...
- MySQL日期数据类型和时间类型使用总结
转自: http://blog.chinaunix.net/space.php?uid=11327712&do=blog&id=32416 MySQL 日期类型:日期格式.所占存储空间 ...
- MySQL数据库数据类型以及INT(M)的含义
nt(M)我们先来拆分,int是代表整型数据那么中间的M应该是代表多少位了,后来查mysql手册也得知了我的理解是正确的,下面我来举例说明. MySQL 数据类型中的 integer types ...
- Mysql数据库里面的String类型依照数字来排序以及按时间排序的sql语句
今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决的方法: 如: SELECT * FROM Stude ...
随机推荐
- Java程序员要注意的10个问题————————好东西就是要拿来分享
[本文来自优优码:http://www.uucode.net/201406/ten-issue-for-java],好东西就是要拿来分享 1. Array 转为 ArrayList 很多人会这么写: ...
- Zygote(app_process)相关分析1
首先我们从Init.c中来看,当Init中解析完init.rc文件时会得到一系列的action,通过action去调用一些函数. Zygote是在init.rc中service section中 se ...
- hdu 4308 Saving Princess claire_
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Description Princess cla ...
- poj 1862 Stripies/优先队列
原题链接:http://poj.org/problem?id=1862 简单题,贪心+优先队列主要练习一下stl大根堆 写了几种实现方式写成类的形式还是要慢一些... 手打的heap: 1: #inc ...
- 从零开始学ios开发(三):第一个有交互的app
感谢大家的关注,也给我一份动力,让我继续前进.有了自己的家庭有了孩子,过着上有老下有小的生活,能够挤出点时间学习真的很难,每天弄好孩子睡觉已经是晚上10点左右了,然后再弄自己的事情,一转眼很快就到12 ...
- iOS8 超简单的设置圆角按钮 ImageView等UIView
button.layer.cornerRadius = // 这个值根据你想要的效果可以更改 button.clipsToBounds = true 这种方法不止可以设置按钮,UIView应该都可以设 ...
- 2. VS使用---HelloWorld
摘要: ------------------------------------------------------------------------------------- 1. VS2010里 ...
- OC中数组类NSArray的详解,常用属性和方法(一)
数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制. 通过下标访问数组元素,下标从0开始. NSA
- color the python console text
//install termcolor module cd \ cd python27 cd scripts pip install termcolor pip install colorama // ...
- 基于.net mvc的校友录(六、codefirst的使用以及班级模块的关键部分实现)
通过EF将新用户存入数据库 这里,探讨一下如何使用EF的code first将数据存入数据库,以及如何对用户的密码进行md5加密与验证.下面是用户登陆的前台代码. @using (Html.Begin ...