时间:2021-07-01 10:21:17 帮助过:3人阅读
我们创建了一个表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的介绍
标签: