mysql 中的这个长度设置,即 int(n) 是什么意思,以及“无符号”和“填充零”又代表什么意思?
无符号:
首先int(n),Integer(n) 长度为32位二进制整数(4字节),勾选上“无符号”时表示禁止负数,取值从0开始。此时可以表示的范围是 0 ---- 2e(32)-1 ,你可以存储任何在这个范围内的数字。(即符号位也用于具体数字的存储)
填充零:
勾选上“零填充”之后就会有很大的不同,若选择 int(4),存储 18 (十进制),则数据库中显示的是 0018(十进制),如果填写 12345(十进制),此时超过了选择的指定宽度 4,但未超过 int 可存储范围(无符号时:0 ---- 2e(32)-1),会按原样存储。
int(n):
n 的定义与存储空间没有任何关系,底层存储还是4个字节。
此处的 int(n) 中的 n 仅仅指的是显示宽度,显示宽度只用于显示,并不能限制取值范围和占用空间,如:int(3) 会占用 4 个字节的存储空间,并且允许的最大值也不会是 999,而是 int 整型所允许的最大值(无符号时:2e(32)-1)。
该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
即 mysql 需要用多少个十进制位来显示该列数值。int 的最大有效显示宽度为11(勾选“无符号”时32位二进制最大可转化的十进制位数)。此时如果勾选过“零填充”,数字显示会自动填充零。
声明整型数据列时,我们可以为它指定个显示宽度,如 int(5),指定显示宽度为5个十进制位,如果没有给它指定显示宽度,MySQL会为它指定一个默认值:11,即 int 的最大十进制长度。
4.1.1.1. 有无符号 在项目中使用 BIGINT,而且是有符号的。
演示
create table test_unsigned(a int unsigned, b int unsigned);
insert into test_unsigned values(1, 2);
select b - a from test_unsigned;
select a - b from test_unsigned; --运行出错
4.1.1.2. INT(N)是什么?
演示
create table test_int_n(a int(4) zerofill);
insert into test_int_n values(1);
insert into test_int_n values(123456);
int(N)中的 N 是显示宽度, 不表示 存储的数字的 长度 的上限。
zerofill 表示当存储的数字 长度 < N 时,用 数字 0 填充左边,直至补满长度 N
当存储数字的长度 超过 N 时 ,按照 实际存储 的数字显示
显示宽度只是指明MYSQL最大可能显示的数字个数,数值的位数小于指定的宽度时会有空格填充,取决于你的设置。如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入显示出来。
创建表时,可以在INT后面加入数值。请注意这个数值不代表数据的长度。例如id字段的数据类型为INT(4),注意到后面的数字4,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数,实际存储的长度还是上表中INT的取值范围即-2147483648~2147483648。
注意事项
显示宽度只用于显示,并不能限制取值范围和占用空间。比如INT(3)会占用4个字节的存储空间。