IT技术博客大学习 共学习 共进步

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

MySQLOPS 数据库与运维自动化技术分享 2012-05-03 00:03:43 浏览 3,781 次

导读

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. MySQL数据库中的5种数据类型简介 (阅读 5,221)
  2. 千万不要把 bool 当成函数参数 (阅读 5,121)
  3. MySQL数据库之枚举数据类型ENUM的DDL变更测试 (阅读 4,703)
  4. MySQL数据库数据类型之枚举类型ENUM测试总结 (阅读 4,701)
  5. java enum枚举类型用法小结 (阅读 3,260)
  6. PHP中的数据类型 (阅读 3,121)
  7. Java数据类型和MySql数据类型对应表 (阅读 2,980)
  8. MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结 (阅读 2,941)
  9. 再谈JavaScript的数据类型问题 (阅读 2,841)
  10. MySQL数据库之集合类型SET的DDL变更测试总结 (阅读 2,400)