一.UNSIGNED
UNSIGNED属性就是将数字类型无符号化,与C、C++这些程序语言中的unsigned含义相同。例如,INT的类型范围是-2 147 483 648 ~ 2 147 483 647, INT UNSIGNED的范围类型就是0 ~ 4 294 967 295。
看起来这是一个不错的属性选项,特别是对于主键是自增长的类型,因为一般来说,用户都希望主键是非负数。然而在实际使用中,UNSIGNED可能会带来一些负面的影响。
先创建一张表t:
CREATE TABLE t
(
a INT UNSIGNED,
b INT UNSIGNED
)ENGINE = INNODB;
再插入一条数据:
INSERT INTO t SELECT 1,2;
查找:
SELECT a - b FROM t
结果报错了,截图如下:
解释:
a-b的十六进制结果是0xFFFFFFFF,只是0xFFFFFFFF可以代表两种值:
对于无符号的整型值,其是整型数的最大值,即4 294967 295;
对于有符号的整型数来说,第一位代表符号位,如果是1,表示是负数,这时应该是取反加1得到负数值,即-1。
所以这条语句在MySQL中运行,可能会得出-1,或是一个很大的整数,或者报错。
二.ZEROFILL
先看一下t的建表语句:
整形是4字节的,int(10)代表的是什么?其实int(M)中的M值只是指定显示长度,并不表示存储长度。
对表修改一下:
ALTER TABLE t CHANGE COLUMN a a INT(4) UNSIGNED ZEROFILL;
查询看一下:
这就是ZEROFILL属性的作用,如果宽度小于设定的宽度,则自动填充0,其实在数据库内部存储的还是1,0001只是设置了ZEROFILL属性后的一种格式化输出。