工作中又发现这个的BUG,有同事以为int(20) 就能存放 20位的数字,就设置了这么个字段用来记录金额(单位:厘),结果溢出了。
总结:
1、int、bigint、smallint、tinyint 可存放值范围与长度(length) 无关系、无关系、无关系!
2、长度只是在填充0的时候才能显示出不一样。
举例:
1、int(2) 与int(11) 后的括号中的字符表示显示宽度,整数列的显示宽度与 MySQL 需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int类型的字段能存储的数据上限依旧是2147483647(有符号型)和4294967295(无符号型)。
2、tinyint(3)与 tinyint(10)的存放值范围是 0~255 或 -128 ~ 127,如果存入值:1,开启0填充,那么 tinyint(3)结果是001、tinyint(10)结果是0000000001。
【知识点1】
bigint
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。
P.S. bigint已经有长度了,在mysql建表中的length,只是用于显示的位数
int
从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。
smallint
从 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型数据。存储大小为 2 个字节。
tinyint
从 0 到 255 的整型数据。存储大小为 1 字节。
【知识点2】
int(M) 中的M指示最大显示宽度,最大有效显示宽度是 255,且显示宽度与存储大小或类型包含的值的范围无关。
首先说一下 MySQL 的数值类型,MySQL 支持所有标准 SQL 数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。关键字 INT 是 INTEGER 的同义词,关键字 DEC 是DECIMAL 的同义词。