楼主: Amygo

[原创] MySQL数据类型:ENUM、SET、BOOL/BOOLEAN、TINYINT特性介绍

[复制链接]
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
41#
 楼主| 发表于 2019-6-6 17:16 | 只看该作者
(三)集合类型SET字段DDL变更
a)去掉集合类型字段定义的默认值属性
root@localhost : mysqlops 03:01:38> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’) NOT NULL;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

小结:
MySQL数据库集合类型字段定义属性为制定了非NULL且有缺省的默认值,对其进行DDL变更,单独去掉缺省的默认值属性,不会出现锁表、重建表等操作,这符合MySQL数据库表DDL变更的特性。

b)去掉集合类型字段定义的NOT NULL 属性
root@localhost : mysqlops 03:04:48> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’);
Query OK, 20017251 rows affected (2 min 4.40 sec)
Records: 20017251 Duplicates: 0 Warnings: 0

小结:
MySQL数据库表字段的非NULL属性,修改为默认NULL属性,则会导致锁表与表重建,对于MySQL数据库集合类型字段也同样存在此问题。

使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
42#
 楼主| 发表于 2019-6-11 17:19 | 只看该作者
b)去掉集合类型字段定义的NOT NULL 属性
  1. <p>root@localhost : mysqlops 03:04:48> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’);</p><p>Query OK, 20017251 rows affected (2 min 4.40 sec)</p><p>Records: 20017251 Duplicates: 0 Warnings: 0</p>
复制代码


小结:
MySQL数据库表字段的非NULL属性,修改为默认NULL属性,则会导致锁表与表重建,对于MySQL数据库集合类型字段也同样存在此问题。

c)增加集合类型字段定义的默认值
  1. <p>root@localhost : mysqlops 03:07:04> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’) NOT NULL DEFAULT ‘shanghai’;</p><p>Query OK, 20017251 rows affected (2 min 4.79 sec)</p><p>Records: 20017251 Duplicates: 0 Warnings: 0</p>
复制代码


小结:
MySQL数据库表字段属性为NULL,修改为非NULL且有指定的缺省默认值,集合类型字段的DDL变更,也会导致锁表、重新创建等。

d)修改集合类型字段定义的默认值属性
  1. <p>root@localhost : mysqlops 03:11:44> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’) NOT NULL DEFAULT ‘beijing’;</p><p>Query OK, 0 rows affected (0.01 sec)</p><p>Records: 0 Duplicates: 0 Warnings: 0</p><p></p>
复制代码

小结:
对MySQL数据库表集合类型字段属性为非NULL且有缺省的默认值,仅仅是修改集合类型字段缺省的默认,MySQL数据库不会出现锁表等情况。


使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
43#
 楼主| 发表于 2019-6-13 16:15 | 只看该作者
e)修改集合类型字段定义的默认值,且新默认值不在集合列表中
  1. <p>root@localhost : mysqlops 03:12:42> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’) NOT NULL DEFAULT ‘suzhou’;</p><p>ERROR 1067 (42000): Invalid default value for ‘Work_City’</p><p></p>
复制代码

小结:
修改MySQL数据库集合类型字段缺省的默认值,为集合类型字段值域列表中不存在的集合元素,MySQL数据库回报错,并且集合类型字段的DDL变更SQL语句执行失败。

f)修改集合类型字段定义,尾部追加集合元素
  1. <p>root@localhost : mysqlops 03:12:52> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’,‘nanchang’) NOT NULL DEFAULT ‘xian’;</p><p>Query OK, 0 rows affected (0.00 sec)</p><p>Records: 0 Duplicates: 0 Warnings: 0</p>
复制代码


小结:
修改MySQL数据库集合类型字段的值域列表,为值域列表增加集合元素,以值域列表尾部追加的方式,这类DDL变更,不会导致MySQL数据库出现锁表等情况。

g)修改集合类型字段定义,调整集合元素的顺序
  1. <p>root@localhost : mysqlops 02:57:42> SELECT * FROM mysqlops_set_enum WHERE Work_City=4 LIMIT 1;</p><p>±—±------------±----------+</p><p>| ID | Work_Option | Work_City |</p><p>±—±------------±----------+</p><p>| 44 | | hangzhou |</p><p>±—±------------±----------+</p><p>1 row in set (0.00 sec)</p><p>
  2. </p><p>root@localhost : mysqlops 03:13:03> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘xiamen’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’,‘nanchang’) NOT NULL DEFAULT ‘xian’;</p><p>Query OK, 20017251 rows affected (2 min 20.34 sec)</p><p>Records: 20017251 Duplicates: 0 Warnings: 0</p>
复制代码



使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
44#
 楼主| 发表于 2019-6-17 15:54 | 只看该作者
备注:
DDL变更调整了集合元素 ‘xiamen’ 在集合元素值域列表中的位置,由原来存储序号32,调整为新的存储序号4,而涉及对比的集合元素 ‘hangzhou’ 由存储序号4,调整为新的存储序号8。

  1. root@localhost : mysqlops 03:14:10> SELECT * FROM mysqlops_set_enum WHERE Work_City=4 LIMIT 1;
  2. ±—±------------±----------+
  3. | ID | Work_Option | Work_City |
  4. ±—±------------±----------+
  5. | 12 | | xiamen |
  6. ±—±------------±----------+
  7. 1 row in set (0.00 sec)

  8. root@localhost : mysqlops 03:15:05> SELECT * FROM mysqlops_set_enum WHERE ID=44;
  9. ±—±------------±----------+
  10. | ID | Work_Option | Work_City |
  11. ±—±------------±----------+
  12. | 44 | | hangzhou |
  13. ±—±------------±----------+
  14. 1 row in set (0.00 sec)

  15. root@localhost : mysqlops 03:16:14> SELECT * FROM mysqlops_set_enum WHERE ID=44 and Work_City=4;
  16. Empty set (0.00 sec)

  17. root@localhost : mysqlops 03:17:18> SELECT * FROM mysqlops_set_enum WHERE ID=44 and Work_City=8;
  18. ±—±------------±----------+
  19. | ID | Work_Option | Work_City |
  20. ±—±------------±----------+
  21. | 44 | | hangzhou |
  22. ±—±------------±----------+
  23. 1 row in set (0.00 sec)

  24. root@localhost : mysqlops 03:18:28> SELECT * FROM mysqlops_set_enum WHERE Work_City=1 LIMIT 1;
  25. ±—±------------±----------+
  26. | ID | Work_Option | Work_City |
  27. ±—±------------±----------+
  28. | 1 | | shanghai |
  29. ±—±------------±----------+
  30. 1 row in set (0.00 sec)
复制代码


小结:
我们事先随机显示了一条集合元素等于“hangzhou”的记录,自增序列唯一主键值为:44,方便我们对比MySQL数据库集合类型字段DDL变更之后的数据变化,总结如下:
MySQL数据库集合类型字段的定义属性的集合元素顺序调整,会导致MySQL数据库申请表级锁,并且锁表、创建临时文件等操作;
被DDL变更调整顺序的集合元素,其在MySQL数据库集合类型字段属性存储序号发生变化;
MySQL数据库集合类型字段的定义属性的集合元素顺序调整,导致受其影响的集合元素,字段定义属性中存储顺序都发生变化,数据库表对应的记录值的存储序号也发生变化;
MySQL数据库集合类型字段的定义属性的某个集合元素顺序调整,对其他存储序号未改变的集合元素,对其对应表字段存储的数据序号编号也未发生变化;

使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
45#
 楼主| 发表于 2019-6-18 15:28 | 只看该作者
h)修改集合类型字段定义,删除某个集合元素
  1. <p>root@localhost : mysqlops 02:07:28> SELECT COUNT() FROM mysqlops_set_enum WHERE Work_city=’’;</p><p>±---------+</p><p>| COUNT() |</p><p>±---------+</p><p>| 200559 |</p><p>±---------+</p><p>
  2. </p><p>root@localhost : mysqlops 02:20:39> SELECT COUNT() FROM mysqlops_set_enum WHERE Work_City=‘shenzhen’;</p><p>±---------+</p><p>| COUNT() |</p><p>±---------+</p><p>| 600160 |</p><p>±---------+</p><p>1 row in set (7.82 sec)</p><p>
  3. </p><p>root@localhost : mysqlops 02:25:00> SELECT * FROM mysqlops_set_enum WHERE Work_city=‘shenzhen’ limit 1;</p><p>±----±------------±----------+</p><p>| ID | Work_Option | Work_City |</p><p>±----±------------±----------+</p><p>| 117 | | shenzhen |</p><p>±----±------------±----------+</p><p>1 row in set (0.00 sec)</p><p>
  4. </p><p>root@localhost : mysqlops 03:16:05> ALTER TABLE mysqlops_set_enum MODIFY Work_City SET(‘shanghai’,‘beijing’,‘xiamen’,‘hangzhou’,‘guangzhou’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’,‘nanchang’) NOT NULL DEFAULT ‘xian’;</p><p>Query OK, 20017251 rows affected, 65535 warnings (2 min 22.09 sec)</p><p>Records: 20017251 Duplicates: 0 Warnings: 3801649</p><p>
  5. </p><p>root@localhost : mysqlops 03:18:48> SHOW WARNINGS;</p><p>±--------±-----±-------------------------------------------------+</p><p>| Level | Code | Message |</p><p>±--------±-----±-------------------------------------------------+</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 11 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 19 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 34 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 41 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 47 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 50 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 62 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 69 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 76 |</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 82 |</p><p>
  6. </p><p>root@localhost : mysqlops 03:19:14> SELECT COUNT() FROM mysqlops_set_enum WHERE Work_city=’’;</p><p>±---------+</p><p>| COUNT() |</p><p>±---------+</p><p>| 800719 |</p><p>±---------+</p><p>1 row in set (6.29 sec)</p><p>
  7. </p><p>root@localhost : mysqlops 03:24:09> SELECT * FROM mysqlops_set_enum WHERE ID=117;</p><p>±----±------------±----------+</p><p>| ID | Work_Option | Work_City |</p><p>±----±------------±----------+</p><p>| 117 | | |</p><p>±----±------------±----------+</p><p>1 row in set (0.00 sec)</p>
复制代码


小结:
DDL变更SQL语句删除MySQL数据库集合类型字段定义属性的某个集合元素,且该集合元素有对应的数据行存储于数据库表中,将会导致:
MySQL数据库表需要表级别锁,进行锁住表、重建表等操作;
被删除集合元素,对应的数据库表记得行字段的值,将会出现截断,以空字符串替代;
被删除集合元素之后的集合元素存储序号发生变化;
数据库表中集合类型字段的数据值,为保证对应集合类型字段定义属性中的集合元素存储序号,也会做相应的调整;


使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
46#
 楼主| 发表于 2019-6-19 09:54 | 只看该作者
(四)基于集合类型SET字段的索引
a)完成DDL变更之后的数据库表结构
  1. <p>root@localhost : mysqlops 03:25:42> SHOW CREATE TABLE mysqlops_set_enum\G</p><p>*************************** 1. row ***************************</p><p>Table: mysqlops_set_enum</p><p>Create Table: CREATE TABLE mysqlops_set_enum (</p><p>ID int(11) NOT NULL AUTO_INCREMENT,</p><p>Work_Option enum(‘JavaScript’,‘DBA’,‘SA’,‘C++’,‘NA’,‘QA’,‘Java’,‘other’,’’,‘Python’) NOT NULL DEFAULT ‘DBA’,</p><p>Work_City set(‘shanghai’,‘beijing’,‘xiamen’,‘hangzhou’,‘guangzhou’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’,‘nanchang’) NOT NULL DEFAULT ‘xian’,</p><p>PRIMARY KEY (ID)</p><p>) ENGINE=InnoDB AUTO_INCREMENT=20017252 DEFAULT CHARSET=utf8</p><p>1 row in set (0.00 sec)</p>
复制代码


b)MySQL数据库集合类型字段无创建索引时,SQL语句执行计划
  1. <p>root@localhost : mysqlops 03:34:59> EXPLAIN SELECT * FROM mysqlops_set_enum WHERE Work_City=8 LIMIT 1\G</p><p>*************************** 1. row ***************************</p><p>id: 1</p><p>select_type: SIMPLE</p><p>table: mysqlops_set_enum</p><p>type: ALL</p><p>possible_keys: NULL</p><p>key: NULL</p><p>key_len: NULL</p><p>ref: NULL</p><p>rows: 20017710</p><p>Extra: Using where</p><p>1 row in set (0.00 sec)</p>
复制代码


小结:
MySQL数据库表集合类型字段没有创建索引时,集合类型字段作为数据查找条件,完全符合MySQL数据库使用索引的规则,依然是全表扫描,说明集合类型字段定义属性的内部存储序列编号,不能起到数据库索引的功效。

c)MySQL数据库集合类型字段创建索引
  1. <p>root@localhost : mysqlops 03:35:44> ALTER TABLE mysqlops_set_enum ADD INDEX idx_work_city_set(Work_City);</p><p>Query OK, 0 rows affected (1 min 32.40 sec)</p><p>Records: 0 Duplicates: 0 Warnings: 0</p>
复制代码


小结:
为MySQL数据库表集合类型字段创建索引,与文章MySQL 5.5版本对普通索引增删性能的优化描述一样,需要锁表、重新创建表等操作,集合类型字段创建索引也同样需要这样做。

d)MySQL数据库集合类型字段有索引时,SQL语句执行计划
  1. <p>root@localhost : mysqlops 03:38:04> EXPLAIN SELECT * FROM mysqlops_set_enum WHERE Work_City=8 LIMIT 1\G</p><p>*************************** 1. row ***************************</p><p>id: 1</p><p>select_type: SIMPLE</p><p>table: mysqlops_set_enum</p><p>type: ref</p><p>possible_keys: idx_work_city_set</p><p>key: idx_work_city_set</p><p>key_len: 2</p><p>ref: const</p><p>rows: 2024666</p><p>Extra: Using where</p><p>1 row in set (0.00 sec)</p>
复制代码


小结:
MySQL数据库表集合类型字段创建数据库索引之后,同样的数据查找SQL语句,则会根据索引条件查找数据,而不是全表扫描。

e)MySQL数据库集合类型字段上的索引删除
  1. <p>root@localhost : mysqlops 03:44:59> ALTER TABLE mysqlops_set_enum DROP INDEX idx_work_city_set;</p><p>Query OK, 0 rows affected (0.82 sec)</p><p>Records: 0 Duplicates: 0 Warnings: 0</p>
复制代码


小结:
MySQL数据库表集合类型字段上的索引删除DDL变更,同样会导致MySQL数据库使用表级锁,锁表、重新创建表等一系列操作。


使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
47#
 楼主| 发表于 2019-6-20 10:23 | 只看该作者
(五)总结
对MySQL数据库集合类型的字段定义属性,进行了定义属性默认值去除、NOT NULL 修改为NULL 、默认为NULL修改为NOT NULL和缺省默认值、修改缺省的默认值、尾部追加新的集合元素、调整集合元素的位置、为集合元素字段创建索引、观察数据查找SQL语句执行计划、删除索引等一系列的DDL操作,以及观察数据库表中的集合数据变化,我们得出下列结论:
a)集合类型字段的DDL变更,对MySQL数据库的影响基本上与其他数据类型字段的DDL变更类似;
b)集合类型字段的集合元素顺序调整,会导致受影响的集合元素存储编号调整,对应的数据库表中的数据编号也会被修改;
c)集合类型字段的集合元素顺序调整,不会跟枚举类型字段一样,出现数据库表数据对照关系的紊乱;
d)集合类型字段的集合元素与表存储的顺序编号之间的对照关系,无法起到索引查找数据的功能。需要时,推荐为数据库表集合类型字段创建索引;
e)鉴于集合类型字段的集合元素顺序调整,会导致数据库表锁住等操作,建议不要轻易调整集合元素的顺序;
f)集合类型字段的集合元素增加,最好尾部追加的方式增加,否则需要锁表等一系列操作,影响数据库表的事务处理;
g)删除集合类型字段定义的某个集合元素,会导致数据库表中对应的数据行发生截断行为,并且用空字符串替代;
h)集合类型字符定义属性,最好申明为NOT NULL,且有缺省的默认值数据。


使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
48#
 楼主| 发表于 2019-6-20 10:24 | 只看该作者
接下来我们详细介绍集合类型enum测试过程与总结,加深对mysql数据库集合类型enum的理解记忆。

使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
49#
 楼主| 发表于 2019-6-20 10:25 | 只看该作者
枚举类型ENUM

a).数据库表mysqlops_enum结构
执行数据库表mysqlops_enum创建的SQL语句:
  1. <p>root@localhost : test 11:22:29> CREATE TABLE Mysqlops_enum(ID INT NOT NULL AUTO_INCREMENT,</p><p>-> Job_type ENUM(‘DBA’,‘SA’,‘Coding Engineer’,‘JavaScript’,‘NA’,‘QA’,’’,‘other’) NOT NULL,</p><p>-> Work_City ENUM(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘other’) NOT NULL DEFAULT ‘shanghai’,</p><p>-> PRIMARY KEY(ID)</p><p>-> )ENGINE=InnoDB CHARACTER SET ‘utf8’ COLLATE ‘utf8_general_ci’;</p><p>Query OK, 0 rows affected (0.00 sec)</p><p>执行查询数据库表Mysqlops_enum结构的SQL语句:</p><p>root@localhost : test 11:23:31> SHOW CREATE TABLE Mysqlops_enum\G</p><p>*************************** 1. row ***************************</p><p>Table: Mysqlops_enum</p><p>Create Table: CREATE TABLE Mysqlops_enum (</p><p>ID int(11) NOT NULL AUTO_INCREMENT,</p><p>Job_type enum(‘DBA’,‘SA’,‘Coding Engineer’,‘JavaScript’,‘NA’,‘QA’,’’,‘other’) NOT NULL,</p><p>Work_City enum(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘other’) NOT NULL DEFAULT ‘shanghai’,</p><p>PRIMARY KEY (ID)</p><p>) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8</p><p>1 row in set (0.00 sec)</p>
复制代码

小结:
为方便测试枚举类型,如何处理字段定义的默认值、是否允许为NULL和空值的情况,我们定义了2个枚举类型的字段名,经过对比创建与查询数据库中表的结构信息,没有发现MySQL数据库默认修改任何信息。
---------------------

b). 写入不同类型的测试数据
写入一条符合枚举类型定义的记录值:
  1. <p>root@localhost : test 11:22:35> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(1,‘QA’,‘shanghai’);</p><p>Query OK, 1 row affected (0.00 sec)</p>
复制代码

测试第二个枚举类型字Work_City是否允许为空记录值:
  1. <p>root@localhost : test 11:22:42> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(2,‘NA’,’’);</p><p>Query OK, 1 row affected, 1 warning (0.00 sec)</p><p>
  2. </p><p>root@localhost : test 11:22:48> SHOW WARNINGS;</p><p>±--------±-----±-----------------------------------------------+</p><p>| Level | Code | Message |</p><p>±--------±-----±-----------------------------------------------+</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 1 |</p><p>±--------±-----±-----------------------------------------------+</p><p>1 row in set (0.00 sec)</p>
复制代码

测试第二个枚举类型字段Work_City是否允许存储NULL值:
  1. <p>root@localhost : test 11:22:53> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(3,‘Other’,NULL);</p><p>ERROR 1048 (23000): Column ‘Work_City’ cannot be null</p>
复制代码

测试第一个枚举类型字段Job_type是否可以存储空白值:
  1. <p>root@localhost : test 11:22:59> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(4,’’,‘hangzhou’);</p><p>Query OK, 1 row affected (0.00 sec)</p>
复制代码

测试第二个枚举类型字段Job_City如何处理没有在定义中描述的值域第一个枚举类型字段Work_Type的默认值没指定情况下,会默认填写那个值:
  1. <p>root@localhost : test 11:23:06> INSERT INTO Mysqlops_enum(ID,Work_City) VALUES(5,‘ningbo’);</p><p>Query OK, 1 row affected, 1 warning (0.00 sec)</p><p>
  2. </p><p>root@localhost : test 11:23:13> SHOW WARNINGS;</p><p>±--------±-----±-----------------------------------------------+</p><p>| Level | Code | Message |</p><p>±--------±-----±-----------------------------------------------+</p><p>| Warning | 1265 | Data truncated for column ‘Work_City’ at row 1 |</p><p>±--------±-----±-----------------------------------------------+</p><p>1 row in set (0.00 sec)</p>
复制代码

测试第二个枚举类型字段未插入数据的情况下,是否能使用上字段定义中指定的默认值:
  1. <p>root@localhost : test 11:23:17> INSERT INTO Mysqlops_enum(ID,Job_type) VALUES(6,‘DBA’);</p><p>Query OK, 1 row affected (0.00 sec)</p>
复制代码

小结:
I.若是枚举类型字段定义为非NULL,默认的SQL_MODE模式下,插入NULL值则会报错,导致SQL语句执行失败;若是没有明确申明非NULL,则允许插入NULL值;
II.若是枚举类型字段的枚举值中,没有指定空格字符值,插入空格字符数据时,会出现数据截断的警告信息,但是SQL语句依然执行成功;
III.若是向枚举类型字段插入未在定义列表中出现的数据,则会出现数据截断的警告信息,但是SQL语句依然执行成功;
IV.若是枚举类型定义为非NULL,向数据库表中插入新数据,但未指定枚举类型字段的值,则使用枚举类型字段定义申明的默认值,若是无显示申明则是采用枚举类型字段的枚举列表中第一个值作为默认值;


使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
50#
 楼主| 发表于 2019-6-24 10:20 | 只看该作者
c). 查询数据库表mysqlops_enum的数据
查询枚举类型数据库表Mysqlops_enum所有的数据(注释:两个枚举类型字段都是非NULL,所以截断后的值为空格):
  1. <p>root@localhost : test 11:23:24> SELECT * FROM Mysqlops_enum;</p><p>±—±---------±----------+</p><p>| ID | Job_type | Work_City |</p><p>±—±---------±----------+</p><p>| 1 | QA | shanghai |</p><p>| 2 | NA | |</p><p>| 4 | | hangzhou |</p><p>| 5 | DBA | |</p><p>| 6 | DBA | shanghai |</p><p>±—±---------±----------+</p><p>5 rows in set (0.00 sec)</p>
复制代码

验证枚举类型字段存储的是数据对应的序列编号,而不是真实的字符串值,且序列号是与枚举类型字段值域列表中的顺序有关:
  1. <p>root@localhost : test 11:23:57> SELECT * FROM Mysqlops_enum WHERE Work_City=0;</p><p>±—±---------±----------+</p><p>| ID | Job_type | Work_City |</p><p>±—±---------±----------+</p><p>| 2 | NA | |</p><p>| 5 | DBA | |</p><p>±—±---------±----------+</p><p>2 rows in set (0.00 sec)</p><p>root@localhost : test 01:22:08> SELECT * FROM Mysqlops_enum WHERE Work_City=1;</p><p>±—±---------±----------+</p><p>| ID | Job_type | Work_City |</p><p>±—±---------±----------+</p><p>| 1 | QA | shanghai |</p><p>| 6 | DBA | shanghai |</p><p>±—±---------±----------+</p><p>2 rows in set (0.00 sec)</p><p>
  2. </p><p>root@localhost : test 02:40:31> SELECT * FROM Mysqlops_enum WHERE Work_City=2;</p><p>Empty set (0.00 sec)</p><p>
  3. </p><p>root@localhost : test 02:40:33> SELECT * FROM Mysqlops_enum WHERE Work_City=3;</p><p>±—±---------±----------+</p><p>| ID | Job_type | Work_City |</p><p>±—±---------±----------+</p><p>| 4 | | hangzhou |</p><p>±—±---------±----------+</p><p>1 row in set (0.01 sec)</p><p>
  4. </p><p>root@localhost : test 02:40:34> SELECT * FROM Mysqlops_enum WHERE Work_City=4;</p><p>Empty set (0.00 sec)</p><p>
  5. </p><p>root@localhost : test 02:40:36> SELECT * FROM Mysqlops_enum WHERE Work_City=5;</p><p>Empty set (0.00 sec)</p><p>
  6. </p><p>root@localhost : test 02:40:37> SELECT * FROM Mysqlops_enum WHERE Work_City=6;</p><p>Empty set (0.00 sec)</p><p>root@localhost : test 04:29:07> SELECT * FROM Mysqlops_enum WHERE Job_type=7;</p><p>±—±---------±----------+</p><p>| ID | Job_type | Work_City |</p><p>±—±---------±----------+</p><p>| 4 | | hangzhou |</p><p>±—±---------±----------+</p><p>1 row in set (0.00 sec)</p>
复制代码


枚举类型数据小结:
I.枚举类型字段定义必须为确定的值,不能为变量、函数、表达式等;
II.若是向枚举类型字段插入NULL值,且枚举类型的字段定义为非NULL,SQL语句会执行失败;
III.若是向枚举类型字段插入,其枚举列表值域中不存在的值,则会发生字段值的截断,并且用空格字符串值替代,其存储的序列编号为0;
IV.若是枚举类型字段定义的枚举列表值域中存在空字符串值,该枚举类型字段发生字段值截断,则是会用空格值替代,但是其存储的序列号与枚举列表中存储的序列号不同,也即参考事例所示:
  1. <p>root@localhost : test 04:37:32> SELECT * FROM Mysqlops_enum WHERE Job_type=0;</p><p>±—±---------±----------+</p><p>| ID | Job_type | Work_City |</p><p>±—±---------±----------+</p><p>| 8 | | hangzhou |</p><p>±—±---------±----------+</p><p>1 row in set (0.00 sec)</p><p>
  2. </p><p>root@localhost : test 04:37:35> SELECT * FROM Mysqlops_enum WHERE Job_type=’’;</p><p>±—±---------±----------+</p><p>| ID | Job_type | Work_City |</p><p>±—±---------±----------+</p><p>| 4 | | hangzhou |</p><p>| 8 | | hangzhou |</p><p>±—±---------±----------+</p><p>2 rows in set (0.00 sec)</p>
复制代码

V.若是枚举类型字段定义为非NULL,且没有为该字段指定值的方式插入数据行,则把字段定义显式申明的默认值作为字段默认值,没有显式申明则把枚举列值域表中第一个值作为默认值;
VI.若是枚举类型字段允许插入NULL值,则NULL值对应存储的序列号为NULL。
---------------------
作者:Amy—go


使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表