点击上方“IT微联盟”,选择“置顶或者星标”
unsigned 就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。看起来unsigned 是个不错的类型,尤其是用在自增或者没有负数的情况。但是在实际使用中会出现一些意外的情况。
如上图,我们新建了一个测试表,两个字段均为unsigned int型,插入两个值,然后做减法运算时报错,并不是我们想要的结果,正常情况 1-2=-1,但是当数据类型为unsigned时,MySQL 运算的结果也是unsigned,而 -1 已经超出了unsigned 范围,所以会报错。
如何解决这个问题呢,设置一下sql_mode就可以解决这个问题
set sql_mode = 'NO_UNSIGNED_SUBTRACTION';
sql_mode 的设置是有风险的,因为可以通过这个设置允许一些非法的操作。如将 null 值插入not null字段,将非法的日期2017-12-32插入到日期字段。一般在生产环境都都设置为严格模式。所以在不熟悉MySQL底层机制或者不了解 unsigned 原理时,慎用它。提示:在主键自增和一些确认的值可以使用。
zerofill 类似一个显示属性,首先来看看MySQL数据库中数字类型后面的长度是什么意思呢,使用show create table 命令来看表的建表语句。
可以看到 int(10) ,这代表什么意思呢?整型不就是4个字节,这个10代表什么意思,如果没有zerofill这属性,括号类的数字没有意义。
我们先来查询一下表的数据
然后我们修改列,对其添加zerofill属性
alter table t_test1 change column a a int(4) unsigned zerofill;
再来查看表的数据
a 字段前面增加了3个0,这是为什么,因为zerofill属性起作用了,当插入mysql中该字段的值的长度小于定义的长度时,会在数值前面补全相应数据的0。
- end -
点小程序,免费练习BATJ最新、最全面试题目。
做个优雅的程序员---springboot整合Websocket(聊天室)
做个优雅的程序员---如何在Linux下正确的查询日志
做个优雅的程序员---SQL优化问题
精选学习资料(视频、文档、讲解)
关注下作者哦!
获取更多面试资料
请长按下方图片扫码关注
你的关注是对作者最大的鼓励
每一个“好看”,都是对我们最大的肯定!