mysql数据类型解析

目录

1、int(10)与int(11)的区别?

结论1:在unsigned修饰下int缺省M默认为10

结论2:int(M)的M只是显示的长度,存储数值不足M位的会补0

结论3:int缺省M默认为11,且不同M存储值相同 

结论4:M与存储占用内存无关

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值