MySQL 中 tiny(M) / smallint(M) / int(M) / bigint(M) 的 M 值

本文发布于 7 年前,部分内容可能已经失去参考价值。

在 MySQL 中,int 的取值范围是 [-2147483648, 2147483647],占用 4 个字节。

int(M) 中 M 的默认值为 11,该值不影响取值范围和占用字节,仅表示最大显示宽度


以某 int 字段存储的记录值为 2147483647 为例:

类型为 int(1) 时,SELECT 结果为 214
类型为 int(2) 时,SELECT 结果为 2147
……
类型为 int(7) 时,SELECT 结果为 214748364
类型为 int(8) ~ int(11) 时,SELECT 结果为 2147483647


测试结果跟网上的说法不同


如果添加了 zerofill 属性,当然是填充零的效果,仍以上述值为例:

类型为 int(1) 时,SELECT 结果为 214
类型为 int(2) 时,SELECT 结果为 2147
……
类型为 int(7) 时,SELECT 结果为 214748364
类型为 int(8) ~ int(10) 时,SELECT 结果为 2147483647
类型为 int(11) 时,SELECT 结果为 02147483647


结论,既然 M 值不影响取值范围和占用字节,那么何必去改它呢。除非有特殊业务需求,否则很容易引起逻辑混乱,特别是当你误认为它是用来限定取值范围或节省存储空间的时候。

xoyozo 7 年前
转载请注明出处
可能相关的内容