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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM