unsigned与 zerofill,MySQL 的两个特殊属性

2019-03-1706:59:23数据库教程Comments3,030 views字数 801阅读模式

1 unsigned文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

unsigned 就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。看起来unsigned 是个不错的类型,尤其是用在自增或者没有负数的情况。但是在实际使用中会出现一些意外的情况。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

unsigned与 zerofill,MySQL 的两个特殊属性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

如上图,我们新建了一个测试表,两个字段均为unsigned int型,插入两个值,然后做减法运算时报错,并不是我们想要的结果,正常情况 1-2=-1,但是当数据类型为unsigned时,MySQL 运算的结果也是unsigned,而 -1 已经超出了unsigned 范围,所以会报错。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

如何解决这个问题呢,设置一下sql_mode就可以解决这个问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

set sql_mode = 'NO_UNSIGNED_SUBTRACTION';文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

unsigned与 zerofill,MySQL 的两个特殊属性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

sql_mode 的设置是有风险的,因为可以通过这个设置允许一些非法的操作。如将 null 值插入not null字段,将非法的日期2017-12-32插入到日期字段。一般在生产环境都都设置为严格模式。所以在不熟悉MySQL底层机制或者不了解 unsigned 原理时,慎用它。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

2 zerofill文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

zerofill 类似一个显示属性,首先来看看MySQL数据库中数字类型后面的长度是什么意思呢,使用show create table 命令来看表的建表语句。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

unsigned与 zerofill,MySQL 的两个特殊属性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

可以看到 int(10) ,这代表什么意思呢?整型不就是4个字节,这个10代表什么意思,如果没有zerofill这属性,括号类的数字没有意义。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

我们先来查询一下表的数据文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

unsigned与 zerofill,MySQL 的两个特殊属性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

然后我们修改列,对其添加zerofill属性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

alter table t_test1 change column a a int(4) unsigned zerofill;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

再来查看表的数据文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

unsigned与 zerofill,MySQL 的两个特殊属性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

a 字段前面增加了3个0,这是为什么,因为zerofill属性起作用了,当插入mysql中该字段的值的长度小于定义的长度时,会在数值前面补全相应数据的0。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10028.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/10028.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定