本文共 2008 字,大约阅读时间需要 6 分钟。
在讨论MySQL数据库中数值类型时,tinyint(1) 和 tinyint(4) 这两个类型经常被提及。很多人对它们的区别并不清楚,因此本篇文章将从基础概念出发,深入分析两者的不同点。
MySQL 中的数值类型中,tinyint(M) 并非仅限于整数类型。实际上,M 在这里并非表示最大值,而是字段的显示宽度。与字符串类型 varchar(M) 不同,数值类型的长度修饰符仅影响显示格式,而不影响存储空间。
对于 signed(有符号)类型,范围为:-128 到 127。
对于 unsigned(无符号)类型,范围为:0 到 255。默认显示宽度分别为 4 和 3 个字符。无论是 tinyint(1) 还是 tinyint(4),它们都只占用 1 个字节(8 位)。因此,它们的存储空间是相同的。
虽然它们的存储空间和数值范围相同,但在以下几个方面有所不同:
显示宽度
符号属性
zerofill 的影响
当启用 zerofill 时:值得注意的是,zerofill 的作用是补零以达到指定的显示长度。如果你的数据格式要求一致,zerofill 可以帮助生成统一长度的数据(如流水号等)。
为了更直观地展示两者的差异,我们可以通过以下 SQL 语句进行测试:
CREATE TABLE `pre_demo` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `unsigned_t` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000', `signed_t` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000', `t1` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0', `t2` tinyint(2) unsigned zerofill NOT NULL DEFAULT '00', `t3` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000', `t4` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000', `t5` tinyint(5) unsigned zerofill NOT NULL DEFAULT '00000', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;INSERT INTO pre_demo VALUES(NULL,8,8,8,8,8,8,8);INSERT INTO pre_demo VALUES(NULL,123,123,123,123,123,123,123);SELECT * FROM pre_demo;
运行上述 SQL 语句后,表中数据如下:
id | unsigned_t | signed_t | t1 | t2 | t3 | t4 | t5 |
---|---|---|---|---|---|---|---|
1 | 008 | 0008 | 8 | 08 | 008 | 0008 | 00008 |
2 | 123 | 0123 | 123 | 123 | 123 | 0123 | 00123 |
通过测试可以看出:
0
会显示为 0000
;tinyint(4) 的显示宽度为 3 个字符,默认值 0
会显示为 0000
。虽然MySQL 的 tinyint(1) 和 tinyint(4) 在存储空间和数值范围上相同,但它们的显示宽度和符号属性有所不同。此外,结合 zerofill 可以实现统一数据长度的显示,但大多数情况下,默认设置无需过多调整。
如果你需要生成统一长度的数据(如流水号),则可以考虑使用 zerofill。然而,在日常开发中,默认使用 MySQL 提供的 tinyint(4) 已经足够满足大部分需求。
转载地址:http://rrffk.baihongyu.com/