IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

MySQL数据库数据类型之ENUM、SET、BOOL/BOOLEAN、TINYINT

MySQLOPS 数据库与运维自动化技术分享 2012-05-03 00:03:43 累计浏览 3,867 次
本机暂存

导读

MySQL数据库产品提供了三种特殊用处的数据类型: SET(集合类型)、ENUM(枚举类型)、BOOL/BOOLEAN(布尔类型),而多数开发工程师,甚至DBA从业者对如何使用好这三种数据类型,以及在什么样的应用场景下使用并不十分清晰,这三种数据类型与微整型TINYINT数据类型关系比较亲近,实际项目中大家也多采用TINYINT代替前三者的功能,为此详细分析这四种数据类型,让我们大家一起详细分析清楚。

(一)   数据类型特点

1)         数据类型占用的存储空间与分类

英文名称

中文名称

分类

存储范围

存储空间

ENUM

枚举类型

字符类型

1~65535个元数据

1个字节 或 2个字节

SET

集合类型

1~64个元数据

1,2,3,4 或 8个字节

BOOL/BOOLEAN

布尔类型

数值类型

-128~127 或 0~255

1个字节

TINYINT

微整型

-128~127 或 0~255

1个字节

上述表格传递的信息:

(1).     四种数据类型的存储范围是所属分类中较小或最小数据类型;

(2).     ENUM、SET属于字符串类型;

(3).     BOOL/BOOLEAN、TINYINT属于数值类型;

(4).     BOOL/BOOLEAN与TINYINT的存储空间范围相同,所占存储空间也相同;

2)         数据类型的语法

四种数据类型的定义语法如图1-1所示:

枚举类型集合类型

1-1

四种数据类型字段的值写入与查阅如图1-2所示:

原图已失效

1-2

3)         数据类型的其他信息

(1).     ENUM

a)         枚举类型ENUM字段定义的值域列表中,元素的数量最大不能超过65535;

b)         枚举类型ENUM字段的每个元素值,可以为数字、字母、特殊符号等,必须用一对单引号或一对双引号括起来;

c)         枚举类型ENUM字段的每个元素值必须为常量值,不允许使用变量、任何函数或表达式;

d)         枚举类型ENUM字段定义的值域列表中,不允许显示出现NULL值;

e)         枚举类型ENUM字段存储的值,允许为NULL,且NULL值的序列编号为NULL;

f)          枚举类型ENUM字段定义为非NULL时,则定义语法中默认关键字指定的值,也必须为枚举类型ENUM字段定义的值域列表中存在的值;

g)         枚举类型ENUM字段定义为非NULL时,字段无指定的值写入,若是有显示申明的默认值时,采用默认关键字指定的值;若字段定义无指定默认关键的时,则使用枚举类型ENUM字段定义的值域列表中第一个元素作为默认值;

h)         枚举类型ENUM字段定义没有显式申明为非NULL时,则默认是值为NULL;

i)           集合类型SET字段写入一个值域列表中不存在的值,则会默认用空格值替代,序列编号为0,并提示一个警告信息(注释:也跟sql_mode模式有关,严格的模式则会转变为出错,而不是警告提示);

(2).     SET

a)         集合类型SET字段的值域列表中,元素的数量最大不能超过64;

b)         集合类型SET字段的每个元素,可以为数字、字母、特殊符号等,必须用一对单引号或一对双引号括起来,也即必须为字符类型的值,也即不管是字符串还是数字;

c)         集合类型SET字段的每个元素值必须为常量值,不允许使用变量、任何函数或表达式;

d)         集合类型SET字段定义的值域列表中,不允许显示出现NULL值;

e)         集合类型SET字段存储的值,允许为NULL,且NULL值的序列编号为NULL;

f)          集合类型SET字段定义为非NULL时,则定义语法中默认关键字指定的值,也必须为集合类型SET字段定义的值域列表中存在的值;

g)         集合类型SET字段定义为非NULL时,字段无指定的值写入,若是有显示申明的默认值时,采用默认关键字指定的值;若字段定义无指定默认关键的时,则使用集合类型SET字段定义的值域列表中第一个元素作为默认值;

h)         集合类型SET字段定义没有显式申明为非NULL时,则默认是值为NULL;

i)           集合类型SET字段写入一个元素列表中无法组合的集合值,则会默认用空格值替代,序列编号为0,并提示一个警告信息(注释:也跟sql_mode模式有关,严格的模式则会转变为出错,而不是警告提示);;

(3).     BOOL/BOOLEAN

a)         布尔类型的关键可以写成BOOL,或者BOOLEAN,都是正确写法;

b)         布尔类型BOOL/BOOLEAN字段的值,必须为整型或者为(TRUE,FALSE),否则出现截断;

c)         布尔类型BOOL/BOOLEAN等同于TINYINT(1),只是使用其中低位存储值,其他存储位都置0的做法,而且0为FALSE,非0值则为TRUE,后续讲解的数据类型测试会佐证上述信息;

d)         若向布尔类型BOOL/BOOLEAN字段,存储一个非0/1,也非TRUE/FALSE的值,不会出现转换,而是存储你所填写的真实值;

e)         若是向布尔类型BOOL/BOOLEAN字段,存储一个超过其存储范围-128—127或0—255之间的值,会出现截断并用最大(注释:正整数则是最大)或最小的值替换(注释:负整数则是最小);

备注:

     实际使用过程中,我们会发现执行表创建命令之后,发现BOOL/BOOLEAN字段的数据类型默认被转换成TINYINT(1),也不能显式存储TRUE或FALSE,而是用1或0替换。

(4).     TINYINT

整型一共有五种:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其中TINYINT属于整型类型中最小的,存储的值必须为整型的数值,否则会被默认转换或报错(注:取决于MySQL运行时设置的SQL_MODE值要求);

编者注释

鉴于详细讨论与分析四种数据类型的文章篇幅过长,不利于读者的阅读与理解,为此把文章分成三个部分,本文为第一部分,也即基础知识梳理篇章,后续二个篇章分别为:数据类型测试、数据类型适合的应用场景。本文也是应朋友们的咨询而进行总结分析,也欢迎更多朋友投稿,或投递想弄清楚的知识点给我们,会尽力给大家逐一解答。

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,253)
  2. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,401)
  3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  4. Mysql监控指南 (累计阅读 21,352)
  5. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  6. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  7. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  8. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,909)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,709)
  10. 深入浅出INNODB MVCC机制与原理 (累计阅读 9,693)