mysql unsigned zero_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 INTUNSIGNED);INSERT INTO t SELECT 1,2;SELECT * FROMt;

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 FROMt;

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) FROMt;

a hex(a)------ --------

0001 1

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值