这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
项目中设置数据库表结构时,对标识状态的字段类型总是不确定使用int(1)还是tinyint(1),在此对两种类型进行对比,并判断各自适用的情境。
1. tinyint
MySQL 中不存在专门的布尔类型,实际存储数据时,对于布尔值,在数据库中的存储类型就是 tinyint。
1.1 tinyint 介绍
tinyint,通过名称可以看出是一种非常小的整数,在 MySQL 中,tinyint 类型在有符号(signed)时允许存储从 -128 到 127 的整数,在无符号(unsigned)情况时允许存储从 0 到 255 的整数,实际占用空间为 1 个字节。
1.2 tinyint(M)
tinyint(M) 中的 M 表示该类型下数值的显示位数,tinyint 类型默认显示位数为4。
- tinyint(1),此类型被 MySQL 默认用于表示布尔值,0代表false,1代表true
- tinyint(4),代表该类型的数值显示的宽度有 4 位,此时必须配合使用 zerofill 属性,才会在不足 4 位时补 0 ,如 2 会显示为 0002。
1.3 tinyint 使用注意
- MySQL 中保存布尔值时用 1 代表 TRUE,0 代表 FALSE,对应的数据类型是 tinyint(1) 。
- 使用 tinyint 类型表示布尔值时,tinyint[1] 表示 true;tinyint[0] 表示false
- 因为 MySQL 中默认使用 tinyint 类型存储布尔值,因此在存储其他非 0 和 1 的数值时,Java 程序中会将获取到的值转成 Boolean 类型,此时 0 对应 false,其他所有数值都对应 true。如果想要在 Java 中获取真实的数值而不是布尔类型,有方法:
- 修改数据库中 tinyint 类型的长度,tinyint 类型的显示长度为 1 (有符号)被默认为表示布尔值,将其设置为 2/3/4 等其他显示长度,此时 Java 中对应 int 类型,显示为正常数值
- 在查询语句上修改,比如对字段执行
*1操作,并定义为新的字段,这样结果也是数值类型
2 int
2.1 int 介绍
int 即整数类型,代表了从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的所有数字,在 MySQL 中占用 4 个存储字节,且对应 Java 中的 int 和 Integer 类型。
2.1 int(11)
int 类型后跟的长度值与 tinyint 一样,只是用来表示数据显示的宽度,并不能决定数据类型占据的存储长度,int 类型后的数值无论是多少,int 占 4 个字节、可以存储 -2,147,483,648 到 2,147,483,647 的属性不会变。
- int(4),表示 int 类型的数据,显示宽度为 4 位,当该类型同时设置了 unsigned(无符号)和 zerofill(补0)时,对于长度不足 4 位的会在显示时补 0 凑齐 4 位长度,对于长度等于或超过 4 位的没有任何影响。
- int(11),对于 int 类型,默认的显示长度就是 11 ,因此使用 int(11) 来定义数据类型,其实数值 11 在默认情况下并没有产生作用。
3. 总结
总的来讲,tinyint 占 1 个字节, int 占 4 个字节,固有属性不会变,对于类型后跟的显示宽度数值,在数据存储中产生的意义不大。
因此在选择 tinyint(1) 还是 int(1) 时要根据字段的实际需求来决定,如果 tinyint 类型范围可以满足则使用 tinyint,否则就使用 int。