面试官:int(1) 和 int(10) 有什么区别?

文摘   科技   2024-11-07 10:00   山西  
最近在和一些同事讨论数据库设计时,碰到一个挺常见的疑问:int(1)int(10) 到底有什么区别?
相信很多人可能会把这个问题当做小事一桩,但要是细究起来,背后其实有一些有趣的点。
尤其是一些同事误用 int(10),结果导致数据库字段设计上出现了冗余,浪费了不少空间。今天,我就来带大家一起深入挖掘这个问题,搞清楚其中的玄机。

1. 领导对 int(1) 的疑虑

其实,我第一次遇到这个问题,是因为领导对数据库表中一个 int(1) 字段产生了疑虑。
领导说:“这个 int(1) 是不是存储的数值只能在 0 到 9 之间?它是不是就是一个单独的数字啊?” 确实,很多人看到 int(1) 就觉得它的数值范围应该非常有限。于是我开始思考,为什么会有这样的误解?后来我才明白,原来大家误把 int(n) 里的 n 当成了数值的“限制”,觉得 int(1) 只能存储个位数,int(10) 就能存储更大的数字了。实际上,int(n) 中的 n 只是影响字段的显示宽度,并不限制字段能够存储的数值范围。

2. int(n) 语法解析

要理解这个问题,首先得弄清楚 int(n) 的语法。其实在 SQL 中,int(n) 表示一个整数类型,其中 n 只是用来定义显示宽度的,并不影响数据的存储大小和数值范围。这一点可能会让大家有些困惑,因为看起来像是 n 会决定数字的长度。
例如,如果你定义了一个 int(1) 类型的字段,它并不是说这个字段只能存储一个数字。实际上,int 的存储大小是固定的,不管你写成 int(1) 还是 int(10),它们都会占用相同的空间(4 字节)。这个 n 只是影响数据的显示格式,而不是数据的存储。你仍然可以存储非常大的数字,int(1) 并不会限制它只能存 0 到 9 之间的值。
为了更好地理解这个问题,让我们来插入一个极端的例子,假设你在一个 int(1)int(10) 字段中插入了最大值。实际操作时,你会发现它们的表现是一样的。比如,插入一个 2147483647 的整数,两个字段都能接受这个数值,虽然我们看到显示格式的不同。
-- 创建一个表格,包含一个 int(1) 和 int(10) 的字段
CREATE TABLE test_table (
    col1 INT(1), 
    col2 INT(10)
);

-- 插入最大值
INSERT INTO test_table (col1, col2) 
VALUES (21474836472147483647);

-- 查询结果
SELECT * FROM test_table;
如果你运行上面的查询,你会发现两个字段中存储的值完全一致,都是 2147483647。你会惊讶地发现,int(1) 也能存储这么大的数字!这就是因为 int(n) 中的 n 只是影响显示,而不影响存储。

3. zerofill 的作用

那么,int(n) 中的 n 到底有什么用呢?其实,它和 zerofill 配合使用时,才会真正展现它的作用。zerofill 是 MySQL 提供的一种格式化选项,它会将数值格式化为指定的宽度,并用零填充。
也就是说,当你使用 int(n)zerofill 一起时,字段会显示为一个固定的宽度,缺少的部分用零来补充。
举个例子,如果你定义了一个 int(4) unsigned zerofill 字段,它的作用就是无论你插入多少位数的数字,都能保证显示为 4 位数,前面不足的部分会自动填充为零。来看一下示例:
-- 创建表格
CREATE TABLE test_table_zerofill (
    col1 INT(4UNSIGNED ZEROFILL
);

-- 插入数据
INSERT INTO test_table_zerofill (col1) 
VALUES (5), (56), (123), (9876);

-- 查询结果
SELECT * FROM test_table_zerofill;
查询结果会显示:
+--------+
| col1   |
+--------+
| 0005   |
| 0056   |
| 0123   |
| 9876   |
+--------+
如你所见,int(4) 的字段会把数值补充为四位,少的部分用零来填充。这在某些场景下非常有用,比如我们常见的订单号、流水号等场景,固定宽度的数字更加整齐,也方便排序和显示。

4. 总结

所以说,int(1)int(10) 的区别,实际上就是一个显示宽度的问题,而不是存储能力的差异。它们的存储大小和数值范围是一样的,都是 4 字节,存储的整数范围是 -21474836482147483647。而 int(n) 中的 n 只是告诉 MySQL 如何显示这个数字,影响的是格式,而不是实际存储的数值大小。
如果你需要按照固定宽度显示数字,zerofill 就能派上用场。它将使得数字变得更加整齐,特别是在你需要规范化显示的时候,像银行账户号码、流水号等场合,都非常有用。
不过,不要被这个“显示宽度”给迷惑了。如果你只是想存储一个整数,完全不需要关心 n 的值,选择 int 类型就好。别让这些显示细节影响了数据库设计的效率和可读性。
希望这篇文章能帮助你解答这个看似简单却容易混淆的问题!下次再遇到类似的疑问,你就能轻松应对了。😎

-END-

ok,今天先说到这,老规矩,看完文章记得右下角给何老师点赞,

最后送给大家一个福利,我这里有一份搞副业的教程,这份教程里有100+个搞钱小项目:

网盘拉新核心玩法、公众号运营变现、小红书虚拟资料引流等,现在扫码加我微信,即可领取这份副业教程。

添加时备注:副业

程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章