MySQL 的兩個特殊數據類型屬性 unsigned與 zerofill

2019-11-16     波波說運維

概述

我們在了解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方面的內容,感興趣的朋友可以關注下~

文章來源: https://twgreatdaily.com/RbGjcW4BMH2_cNUgvI0q.html