一、整型
常见细分为 tinyint、smallint、mediumint、int、bigint 这几种。
tinyint:存储所占一个字节,一个字节等于 8 bit,根据 1 bit可以存储 0 到 1 两种可能性,因此 tinyint 类型可以存储 2 的 8 次方,也就是 256 种可能性,从 0 开始计数,无符号也就是可以存储 0~255,如果是有符号,那就是 -128~127。
smallint:存储所占两个字节,同上也就是可以存储 2 的 16 次方,也就是可以存储 65536 种可能性,无符号从 0 开始则是可以存储 0~65535,有符号则是 -32768~32767。
mediumint:存储所占三个字节,也就是 2 的 24 次方,可以存储 16777216 种可能性,无符号可以存储 0~16777215,有符号可以存储 -8388608~8388607。
int:存储所占四个字节,也就是 2 的 32 次方,可以存储 4294967296 种可能性,无符号可以存储 0~4294967295,有符号则是 -2147483648~2147483647。
bigint:存储所占 8 个字节,也就是 2 的 64 次方,可以存储 2 的 64 次种可能性,无符号可以存储 0~((2³²×²)-1),有符号则是 -(2³²×²)/2 ~ (2³²×²)/2-1。
二、括号
在 MySQL 数据库中,SMALLINT(3) 括号中的数字 3 代表的是显示宽度(Display Width),而不是存储长度或数据范围的限制。
①、核心含义:仅影响显示,不影响存储
存储空间固定:无论括号里的数字是多少(例如 SMALLINT(1)、SMALLINT(3) 或 SMALLINT(100)),SMALLINT 类型始终占用 2 个字节 的存储空间。
取值范围不变:
有符号(SIGNED):范围始终是 -32,768 到 32,767。
无符号(UNSIGNED):范围始终是 0 到 65,535。
即使你定义为 SMALLINT(3),它依然可以存储超过 3 位数的值(如 10000),只要该值在上述范围内即可。
②、实际作用:配合 ZEROFILL 使用
这个数字主要在字段设置了 ZEROFILL(零填充)属性时才有实际视觉效果:
当数值位数小于指定宽度时:数据库会在查询结果中自动在数字左侧补零,直到达到指定的宽度。
当数值位数大于指定宽度时:按实际数值完整显示,不会截断。
举例说明:
假设定义字段为 age SMALLINT(3) ZEROFILL:
插入值 1 -> 查询显示为 001
插入值 12 -> 查询显示为 012
插入值 123 -> 查询显示为 123
插入值 1000 -> 查询显示为 1000(虽然超过了宽度3,但因为在 SMALLINT 范围内,所以正常显示,不补零也不截断)
注意:如果没有设置 ZEROFILL,括号中的数字对数据的存储和显示几乎没有影响。
③、版本变迁与建议
MySQL 8.0.17 及以后版本:官方已弃用整数类型的显示宽度属性和 ZEROFILL 属性。在未来的 MySQL 版本中,这些特性可能会被完全移除。
最佳实践:
在现代 MySQL 开发中,建议直接写 SMALLINT,无需指定括号内的数字。
如果需要在应用层实现“前导零”的效果(如编号 001),建议在应用程序代码中使用格式化函数(如 LPAD)处理,而不是依赖数据库的显示宽度特性。
④、总结
SMALLINT(3) 中的 3 不限制你能存多大的数,也不节省空间。它只是一个旧的显示格式提示,仅在配合 ZEROFILL 时对查询结果的展示形式有影响。在现代数据库设计中,通常可以忽略这个数字。
mysql 第1.14章 创建-smallint(3)