MySQL 的兩個特殊屬性 unsigned與 zerofill


 

  1 unsigned

  unsigned 就是將數字類型無符號化, 例如 int 型的范圍:-2^31 ~ 2^31 - 1,而unsigned int的范圍:0 ~ 2^32。看起來unsigned 是個不錯的類型,尤其是用在自增或者沒有負數的情況。但是在實際使用中會出現一些意外的情況。

  

  如上圖,我們新建了一個測試表,兩個字段均為unsigned int型,插入兩個值,然后做減法運算時報錯,並不是我們想要的結果,正常情況 1-2=-1,但是當數據類型為unsigned時,MySQL 運算的結果也是unsigned,而 -1 已經超出了unsigned 范圍,所以會報錯。

  如何解決這個問題呢,設置一下sql_mode就可以解決這個問題

  set sql_mode = 'NO_UNSIGNED_SUBTRACTION';

  

 

  sql_mode 的設置是有風險的,因為可以通過這個設置允許一些非法的操作。如將 null 值插入not null字段,將非法的日期2017-12-32插入到日期字段。一般在生產環境都都設置為嚴格模式。所以在不熟悉MySQL底層機制或者不了解 unsigned 原理時,慎用它。

 

  2 zerofill

  zerofill 類似一個顯示屬性,首先來看看MySQL數據庫中數字類型后面的長度是什么意思呢,使用show create table 命令來看表的建表語句。

  

  可以看到 int(10) ,這代表什么意思呢?整型不就是4個字節,這個10代表什么意思,如果沒有zerofill這屬性,括號類的數字沒有意義。

 

  我們先來查詢一下表的數據

  

 

  然后我們修改列,對其添加zerofill屬性

  alter table t_test1 change column a a int(4) unsigned zerofill;

 

  再來查看表的數據

  

  a 字段前面增加了3個0,這是為什么,因為zerofill屬性起作用了,當插入mysql中該字段的值的長度小於定義的長度時,會在數值前面補全相應數據的0。

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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