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屬性的一種格式化輸出而已。