难道就为了不够宽度补零而存在?(网上大多都这么说)
看完mysql官方中文文档的内容理解了宽度设置是为了指定显示宽度。
以下是mysql官网对于设置宽度的解释:
“MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。“
“当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。”
靠,能专业点不,一顿乱弹琴
根据个人的实验并结合资料:
1、长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关;
2、长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值,在显示的时候怎么对齐呢?按照手册的说法,是默认用“空格”在左边填充。比如下述表格
CREATE TABLE `inttest` (
`id` int(3) unsigned NOT NULL AUTO_INCREMENT,
`value` varchar(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8
现在分别插入id长度为2,3,4,5位的数据,执行查询以后得到显示如下:
MariaDB [mytest]> select * from inttest;
+-------+-------+
| id | value |
+-------+-------+
| 13 | a |
| 111 | b |
| 1000 | c |
| 10000 | d |
+-------+-------+
4 rows in set (0.00 sec)
如果我们改成ZEROFILL,再次查询的结果如下:
MariaDB [mytest]> select * from inttest;
+-------+-------+
| id | value |
+-------+-------+
| 013 | a |
| 111 | b |
| 1000 | c |
| 10000 | d |
+-------+-------+
4 rows in set (0.00 sec)
我们会发现,不足3位长度的值会被自动填充,而超过3位长度的值就不会被填充了。
只是显示宽度的不同,int是定长存储。具体可以参考我的博客链接 。http://wzmtony.blog.163.com/blog/static/20318015620134153519329/
怎么可能呢
int(8)
如果补0的话
存12345670和1234567有区别嘛
也不是左边补0哦,如果是左边补0,那请问int(4)
存0666这个是八进制呢?还是10进制呢?
如果真的不明白的话,请看这里
mysql数据类型
http://levi.cg.am/?p=2934
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度
int(3)是4个字节,int(8)也是4个字节,他不会因为你的数值而改变,也不补0,他和char不一样