MySQL中UNSIGNED和ZEROFILL的介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中UNSIGNED和ZEROFILL的介绍相关的知识,希望对你有一定的参考价值。

UNSIGNED:

将数字类型无符号化,这与C和C++这些程序语言的unsigned含义相同。

INT的类型范围-2 147 483 648~2 147 483 647

INT UNSIGNED范围0~4 294 967 295

看起来是个不错的属性选项,特别是对于主键自增长的类型,因为一般来说,用户都希望主键是非负数,然而,在实际使用中,UNSIGNED可能会带来一些负面的影响。

示例

CREATE TABLE t(a INT UNSIGNED,b INT UNSIGNED);

INSERT INTO t SELECT 1,2;

SELECT * FROM t;

     a       b 

------  --------

     1         2

我们创建了一个表t,存储引擎为InnoDB,表t 上有两个UNSIGNED的INT类型,输入(1,2)这一行的数据,目前看来是没有问题的,运行如下语句

SELECT a-b FROM t;

 

会报错

BIGINT UNSIGNED value is out of range in ‘(`iot2`.`t`.`a` - `iot2`.`t`.`b`)‘

  

要怎么才能获得-1这个数呢,只需要将SQL_MODE这个参数进行设置即可

SET sql_mode=NO_UNSIGNED_SUBTRACTION;

SELECT a-b FROM t;

   a-b 

--------

      -1

个人看法是尽量不要使用UNSIGNED,因为可能会带来一些意想不到的的效果,对于INT类型可能存放不了的数据,INT UNSIGNED同样可能存放不了,与其如此,还不如在数据库设计阶段将INT类型提升为BIGINT类型

ZEROFILL:

通过t表来表述

Table   Create Table                                                                                                                      

------  ----------------------------------------------------------------------------------------------------------------------------------

t       CREATE TABLE `t` (                                                                                                                

          `a` int(10) unsigned DEFAULT NULL,                                                                                             

          `b` int(10) unsigned DEFAULT NULL                                                                                               

        ) ENGINE=InnoDB DEFAULT CHARSET=utf8      

  

                                                                                       

可以看到int(10),如果没有ZEROFILL这个属性,括号内int(10)这个10的数字是毫无意义

但是对列添加ZEROFILL属性后,结果就有所不同

ALTER TABLE t CHANGE COLUMN a  a INT(4) UNSIGNED ZEROFILL;

 

这里对a列进行了修改,为其添加了ZEROFILL属性,并且将默认的int(10)改成int(4),在进行查找,返回的结果是

     a       b 

------  --------

  0001         2

这是可以看到a的值由原来的1变为0001,这就是ZEROFILL属性的作用,如果宽度小于设定的宽度(这里宽度为4),则自动填充0,需要注意的是,这只是最后显示的结果,在mysql中实际存储的还是1

SELECT a,HEX(a) FROM t;

     a  hex(a) 

------  --------

  0001  1      

可以看到数据库内部存储还是1,0001只是设置了ZEROFILL属性的一种格式化输出而已。

 

以上是关于MySQL中UNSIGNED和ZEROFILL的介绍的主要内容,如果未能解决你的问题,请参考以下文章

请问mysql 中的ZEROFILL是啥意思

MySQL 列,可选择的数据类型(通过sql命令查看:`help create table;`)

MySQL常用数据类型

mysql 的数据类型

mysql中tinyintsmallintmediumint,int 和bigint 的区别

MySQL数据类型