目录
结论2:int(M)的M只是显示的长度,存储数值不足M位的会补0
2、为啥是varchar(255)而不是varchar(256)?
mysql版本:5.7
1、int(10)与int(11)的区别?
int占用4个字节,32位
int(M),M默认为11,M只是展示的长度,与存储占用的多少无关
例如:int(4),存储21,不足4位,查询会显示为0021
若建表语句加上ZEROFILL,会在数字前面补0
所以,int(3)、int(11)、int(5) 存储值范围是一样的,都是 [-2^32, 2^31-1]
int unsigned 则为[0, 2^32]
结果验证
结论1:在unsigned修饰下int缺省M默认为10
建表语句(数据库字段使用zerofill修饰,必须是unsigned类型)
<!-- 执行建表语句 -->
CREATE TABLE `test_int` (
height_1 int(2) unsigned zerofill,
height_2 int(5) unsigned zerofill,
height_3 int(10) unsigned zerofill,
height_4 int(11) unsigned zerofill,
height_5 int unsigned zerofill
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试int表';
<!-- show create table test_int; -->
CREATE TABLE `test_int` (
`height_1` int(2) unsigned zerofill DEFAULT NULL,
`height_2` int(5) unsigned zerofill DEFAULT NULL,
`height_3` int(10) unsigned zerofill DEFAULT NULL,
`height_4` int(11) unsigned zerofill DEFAULT NULL,
`height_5` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试int表'
由height_5可知在unsigned修饰下int缺省M默认为10
结论2:int(M)的M只是显示的长度,存储数值不足M位的会补0
摘自mysql官方文档:MySQL :: MySQL 5.7 Reference Manual :: 11.1.1 Numeric Data Type Syntax
对于整数数据类型,M
表示最大显示宽度。最大显示宽度为 255。显示宽度与类型可以存储的值的范围无关
结论3:int缺省M默认为11,且不同M存储值相同
去掉unsigned zerofill,测试int
alter table test_int add height_7 int(2);
alter table test_int add height_8 int(5);
alter table test_int add height_9 int(10);
alter table test_int add height_10 int(11);
alter table test_int add height_11 int;
<!-- show create table test_int; -->
CREATE TABLE `test_int` (
`height_1` int(2) unsigned zerofill DEFAULT NULL,
`height_2` int(5) unsigned zerofill DEFAULT NULL,
`height_3` int(10) unsigned zerofill DEFAULT NULL,
`height_4` int(11) unsigned zerofill DEFAULT NULL,
`height_5` int(10) unsigned zerofill DEFAULT NULL,
`height_6` int(12) unsigned zerofill DEFAULT NULL,
`height_7` int(2) DEFAULT NULL,
`height_8` int(5) DEFAULT NULL,
`height_9` int(10) DEFAULT NULL,
`height_10` int(11) DEFAULT NULL,
`height_11` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试int表'
由height_11可知int有符号缺省,M默认为11
查询结果
使用相等运算符对比,按照数值去比较,都是相等的
结论4:M与存储占用内存无关
height_7到height_11,即M为2、5、10、11的有符号int都可以存储最大值2147483647
MySQL可以为整数类型指定宽度,例如INT(11),对大多数应用这是没有意义的,
它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。
2、为啥是varchar(255)而不是varchar(256)?
摘自百度百科
VARCHAR(M)是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串。其中M代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
在实际开发过程中,varchar最大长度为1022,2047就过长了,就建议使用text了
摘自mysql官方文档:MySQL :: MySQL 5.7 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types
列中的值VARCHAR
是可变长度的字符串。长度可以指定为 0 到 65,535 之间的值。a 的有效最大长度 VARCHAR
取决于最大行大小(65,535 字节,在所有列之间共享)和使用的字符集。与CHAR
相比, VARCHAR
值存储为 1 字节或 2 字节长度前缀加上数据。长度前缀表示值中的字节数。如果值需要不超过 255 个字节,则一列使用一个长度字节,如果值可能需要超过 255 个字节,则使用两个长度字节。
所以,varchar(255)实质上是占用了256个字节;varchar(1022)实质上是占用了1024个字节
char(4) 与 varchar(4) 对比
存储在表最后一行中的值 仅在不使用严格 SQL 模式时适用;如果启用了严格模式,超过列长度的值 不会被存储,并且会产生错误。
所以一般情况下,除非字符串长度是定值,比如手机号,都是11位,使用char(11)。其余不定长的字符串都建议用varchar