概述
我們在了解mysql數據類型不可避免的要先了解這兩個屬性--unsigned與 zerofill,是否選用這兩個屬性對選擇數據類型有莫大的關係。
1、unsigned
unsigned 就是將數字類型無符號化, 例如 int 型的範圍:-2^31 ~ 2^31 - 1,而unsigned int的範圍:0 ~ 2^32。看起來unsigned 是個不錯的類型,尤其是用在自增或者沒有負數的情況。但是在實際使用中會出現一些意外的情況。
create table t(a int unsigned,b int unsigned);
insert into t select 1,2;
select a-b from t;
--設置sql_mode
set sql_mode = 'NO_UNSIGNED_SUBTRACTION';
select a-b from t;
上圖新建了一個測試表,兩個欄位均為unsigned int型,插入兩個值,然後做減法運算時報錯,並不是我們想要的結果,正常情況 1-2=-1,但是當數據類型為unsigned時,MySQL 運算的結果也是unsigned,而 -1 已經超出了unsigned 範圍,所以會報錯。這種情況只需要設置一下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屬性
select * from t;
alter table t change column a a int(4) unsigned zerofill;
select * from t;
a 欄位前面增加了3個0,這是為什麼,因為zerofill屬性起作用了,當插入mysql中該欄位的值的長度小於定義的長度時,會在數值前面補全相應數據的0。
覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~