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。