本节主要内容:

MySQL数据类型之枚举类型ENUM

MySQL数据库提供针对字符串存储的一种特殊数据类型:枚举类型ENUM,这种数据类型可以给予我们更多提高性能、降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别介绍了布尔类型BOOL或称布尔类型BOOLEAN,以及后续会再单独介绍集合类型SET。

本文详细介绍集合类型enum测试过程与总结,加深对mysql数据库集合类型enum的理解记忆。

n  枚举类型ENUM

a).数据库表mysqlops_enum结构

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

复制代码 代码示例:

root@localhost : test 11:22:29> CREATE TABLE Mysqlops_enum(ID INT NOT NULL AUTO_INCREMENT,

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

->  Work_City ENUM('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_enum结构的SQL语句:

复制代码 代码示例:

root@localhost : test 11:23:31> SHOW CREATE TABLE Mysqlops_enum\G

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

Table: Mysqlops_enum

Create Table: CREATE TABLE `Mysqlops_enum` (

`ID` int(11) NOT NULL AUTO_INCREMENT,

`Job_type` enum('DBA','SA','Coding Engineer','JavaScript','NA','QA','','other') NOT NULL,

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

PRIMARY KEY (`ID`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

小结:

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

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

写入一条符合枚举类型定义的记录值:

复制代码 代码示例:

root@localhost : test 11:22:35> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(1,'QA','shanghai');

Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字Work_City是否允许为空记录值:

复制代码 代码示例:

root@localhost : test 11:22:42> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(2,'NA','');

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

root@localhost : test 11:22:48> SHOW WARNINGS;

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

| Level   | Code | Message              |

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

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

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

1 row in set (0.00 sec)

测试第二个枚举类型字段Work_City是否允许存储NULL值:

复制代码 代码示例:

root@localhost : test 11:22:53> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(3,'Other',NULL);

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

测试第一个枚举类型字段Job_type是否可以存储空白值:

复制代码 代码示例:

root@localhost : test 11:22:59> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(4,'','hangzhou');

Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字段Job_City如何处理没有在定义中描述的值域第一个枚举类型字段Work_Type的默认值没指定情况下,会默认填写那个值:

复制代码 代码示例:

root@localhost : test 11:23:06> INSERT INTO Mysqlops_enum(ID,Work_City) VALUES(5,'ningbo');

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

root@localhost : test 11:23:13> SHOW WARNINGS;

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

| Level   | Code | Message              |

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

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

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

1 row in set (0.00 sec)

测试第二个枚举类型字段未插入数据的情况下,是否能使用上字段定义中指定的默认值:

复制代码 代码示例:

root@localhost : test 11:23:17> INSERT INTO Mysqlops_enum(ID,Job_type) VALUES(6,'DBA');

Query OK, 1 row affected (0.00 sec)

小结:

若是枚举类型字段定义为非NULL,默认的SQL_MODE模式下,插入NULL值则会报错,导致SQL语句执行失败;若是没有明确申明非NULL,则允许插入NULL值;

若是枚举类型字段的枚举值中,没有指定空格字符值,插入空格字符数据时,会出现数据截断的警告信息,但是SQL语句依然执行成功;

若是向枚举类型字段插入未在定义列表中出现的数据,则会出现数据截断的警告信息,但是SQL语句依然执行成功;

若是枚举类型定义为非NULL,向数据库表中插入新数据,但未指定枚举类型字段的值,则使用枚举类型字段定义申明的默认值,若是无显示申明则是采用枚举类型字段的枚举列表中第一个值作为默认值;

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

查询枚举类型数据库表Mysqlops_enum所有的数据(注释:两个枚举类型字段都是非NULL,所以截断后的值为空格):

复制代码 代码示例:

root@localhost : test 11:23:24> SELECT * FROM Mysqlops_enum;

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

| ID | Job_type | Work_City |

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

|  1 | QA       | shanghai  |

|  2 | NA       |           |

|  4 |          | hangzhou  |

|  5 | DBA      |           |

|  6 | DBA      | shanghai  |

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

5 rows in set (0.00 sec)

验证枚举类型字段存储的是数据对应的序列编号,而不是真实的字符串值,且序列号是与枚举类型字段值域列表中的顺序有关:

复制代码 代码示例:

root@localhost : test 11:23:57> SELECT * FROM Mysqlops_enum WHERE Work_City=0;

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

| ID | Job_type | Work_City |

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

|  2 | NA       |           |

|  5 | DBA      |           |

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

2 rows in set (0.00 sec)

root@localhost : test 01:22:08> SELECT * FROM Mysqlops_enum WHERE Work_City=1;

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

| ID | Job_type | Work_City |

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

|  1 | QA       | shanghai  |

|  6 | DBA      | shanghai  |

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

2 rows in set (0.00 sec)

root@localhost : test 02:40:31> SELECT * FROM Mysqlops_enum WHERE Work_City=2;

Empty set (0.00 sec)

root@localhost : test 02:40:33> SELECT * FROM Mysqlops_enum WHERE Work_City=3;

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

| ID | Job_type | Work_City |

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

|  4 |          | hangzhou  |

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

1 row in set (0.01 sec)

root@localhost : test 02:40:34> SELECT * FROM Mysqlops_enum WHERE Work_City=4;

Empty set (0.00 sec)

root@localhost : test 02:40:36> SELECT * FROM Mysqlops_enum WHERE Work_City=5;

Empty set (0.00 sec)

root@localhost : test 02:40:37> SELECT * FROM Mysqlops_enum WHERE Work_City=6;

Empty set (0.00 sec)

root@localhost : test 04:29:07> SELECT * FROM Mysqlops_enum WHERE Job_type=7;

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

| ID | Job_type | Work_City |

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

|  4 |          | hangzhou  |

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

1 row in set (0.00 sec)

枚举类型数据小结:

枚举类型字段定义必须为确定的值,不能为变量、函数、表达式等;

若是向枚举类型字段插入NULL值,且枚举类型的字段定义为非NULL,SQL语句会执行失败;

若是向枚举类型字段插入,其枚举列表值域中不存在的值,则会发生字段值的截断,并且用空格字符串值替代,其存储的序列编号为0;

若是枚举类型字段定义的枚举列表值域中存在空字符串值,该枚举类型字段发生字段值截断,则是会用空格值替代,但是其存储的序列号与枚举列表中存储的序列号不同,也即参考事例所示:

复制代码 代码示例:

root@localhost : test 04:37:32> SELECT * FROM Mysqlops_enum WHERE Job_type=0;

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

| ID | Job_type | Work_City |

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

|  8 |          | hangzhou  |

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

1 row in set (0.00 sec)

root@localhost : test 04:37:35> SELECT * FROM Mysqlops_enum WHERE Job_type='';

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

| ID | Job_type | Work_City |

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

|  4 |          | hangzhou  |

|  8 |          | hangzhou  |

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

2 rows in set (0.00 sec)

若是枚举类型字段定义为非NULL,且没有为该字段指定值的方式插入数据行,则把字段定义显式申明的默认值作为字段默认值,没有显式申明则把枚举列值域表中第一个值作为默认值;

若是枚举类型字段允许插入NULL值,则NULL值对应存储的序列号为NULL;

mysql 枚举_详解MySQL数据类型之枚举类型ENUM的用法相关推荐

  1. 详解mysql事务_详解MySQL执行事务的语法和流程

    摘要:MySQL 提供了多种存储引擎来支持事务. MySQL 提供了多种存储引擎来支持事务.支持事务的存储引擎有 InnoDB 和 BDB,其中,InnoDB 存储引擎事务主要通过 UNDO 日志和 ...

  2. mysql 日期比较_详解Mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: 代码如下 select * from product where add_time = '2 ...

  3. mysql外键约束详解_详解MySQL 外键约束

    详解MySQL 外键约束,西欧,西西里,玛雅,兵种,诺曼 详解MySQL 外键约束 易采站长站,站长之家为您整理了详解MySQL 外键约束的相关内容. 官方文档: https://dev.mysql. ...

  4. mysql分区表truncate分区数据_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

  5. mysql分区表详解_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

  6. mysql通配符escape使用_详解MySQL like如何查询包含'%'的字段(ESCAPE用法)

    在SQl like语句中,比如 SELECT * FROM user WHERE username LIKE '%luchi%' SELECT * FROM user WHERE username L ...

  7. mysql通配符escape使用_详解MySQL like如何查询包含#39;%#39;的字段(ESCAPE用法)-MySQL教程-Web开发者网...

    在SQl like语句中,比如 SELECT * FROM user WHERE username LIKE '%luchi%' SELECT * FROM user WHERE username L ...

  8. mysql5 workbench教程_详解MySQL Workbench使用教程

    MySQL Workbench 是一款专为 MySQL 设计的集成化桌面软件,也是下一代的可视化数据库设计.管理的工具,它同时有开源和商业化两个版本.该软件支持 Windows 和 Linux 系统, ...

  9. mysql如何进行压测_详解MySQL如何按表创建千万级的压测数据

    有时我们要对系统做压测,或者数据库压力测试,这时候需要对某些表插入几百万或者上千万数据,下面介绍下怎么利用MySQL循环和存储过程对特定表的创建千万行数据. 1. 准备测试表 CREATE TABLE ...

最新文章

  1. 关于WordPress中字体加载慢的问题解决方案(转)
  2. Nuget很慢,我们该怎么办
  3. jsp静态导入和动态导入
  4. Kotlin学习记录1
  5. Sublime Text Build 3176 安装图文详细教程
  6. 你会快速裂变顾客吗?
  7. 目标检测——YOLOv5的学习笔记
  8. 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人!
  9. 医疗器械公司规章制度范本
  10. Linux基础知识 | vi编辑器
  11. C++二维vector初始化
  12. 可替换MPS MP2451的高压DCDC芯片FS2451助力智能电表设计40V0.5A降压IC
  13. 微信小程序: 摇色子
  14. C++ 后端开发工程师的技术栈整理
  15. GitLab安装并设置为开机启动
  16. 在 Windows10 系统中安装 Homestead 本地开发环境
  17. Hive 编号函数
  18. STM8L151的IAR工程编译报错Fatal Error[Pe035]: #error directive: “Please select first the target STM8L...
  19. C语言:判断是否是直角三角形
  20. 单部六层电梯西门子逻辑控制竞赛博途V15.1以太网软件仿真

热门文章

  1. 天天说“要卸载知乎”,可大家还是在用,注册用户都1.6亿了
  2. Word中插入图片不清晰、分辨率较低的问题解决方案(VISIO\MATLAB)
  3. web练习一——qq注册面开发(二)
  4. [附源码]计算机毕业设计Node.js星空摄影网站论文(程序+LW)
  5. python利用pyqt5和opencv打开电脑摄像头并进行拍照
  6. 老赵谈IL(4):什么时候应该学IL,该怎么学IL
  7. 激活函数——tanh函数
  8. linux火狐浏览器如何清理缓存,火狐浏览器缓存路径的更改问题解决方法
  9. Ad域控之Ldaps以及Python操作
  10. 用iMazing管理苹果手机的四大特色功能