MySQL 的两个特殊数据类型属性 unsigned与 zerofill

概述

我们在了解mysql数据类型不可避免的要先了解这两个属性--unsigned与 zerofill,是否选用这两个属性对选择数据类型有莫大的关系。


1、unsigned

unsigned 就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。看起来unsigned 是个不错的类型,尤其是用在自增或者没有负数的情况。但是在实际使用中会出现一些意外的情况。

create table t(a int unsigned,b int unsigned);
insert into t select 1,2;
select a-b from t;
--设置sql_mode
set sql_mode = 'NO_UNSIGNED_SUBTRACTION';
select a-b from t;

MySQL 的两个特殊数据类型属性 unsigned与 zerofill

上图新建了一个测试表,两个字段均为unsigned int型,插入两个值,然后做减法运算时报错,并不是我们想要的结果,正常情况 1-2=-1,但是当数据类型为unsigned时,MySQL 运算的结果也是unsigned,而 -1 已经超出了unsigned 范围,所以会报错。这种情况只需要设置一下sql_mode(NO_UNSIGNED_SUBTRACTION)就可以解决

注意:sql_mode 的设置是有风险的,因为可以通过这个设置允许一些非法的操作。如将 null 值插入not null字段,将非法的日期2017-12-32插入到日期字段。一般在生产环境都都设置为严格模式。所以在不熟悉MySQL底层机制或者不了解 unsigned 原理时,慎用它。


2、zerofill

zerofill 类似一个显示属性,首先来看看MySQL数据库中数字类型后面的长度是什么意思呢,使用show create table 命令来看表的建表语句。

MySQL 的两个特殊数据类型属性 unsigned与 zerofill

可以看到 int(10) ,这代表什么意思呢?整型不就是4个字节,这个10代表什么意思,如果没有zerofill这属性,括号类的数字没有意义。

修改列,对其添加zerofill属性

select * from t;
alter table t change column a a int(4) unsigned zerofill;
select * from t;

MySQL 的两个特殊数据类型属性 unsigned与 zerofill

a 字段前面增加了3个0,这是为什么,因为zerofill属性起作用了,当插入mysql中该字段的值的长度小于定义的长度时,会在数值前面补全相应数据的0。


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

MySQL 的两个特殊数据类型属性 unsigned与 zerofill

相关推荐