首頁 > 軟體

詳細深入聊一聊Mysql中的int(1)和int(11)

2022-08-08 14:00:03

前言

首先在吐槽這個現象前,我先說下我們該篇的內容。

1.  int 型別表欄位 在mysql資料庫裡面,到底存值的範圍是多少 ?

什麼時候是  -2147483648到 2147483647  

什麼時候是 0 到4294967295

2. int (1) int(11) 這個括號後面的玩意,對於int來說 作用是什麼?

int(1) 就只能存入 0,1,2,3,4,5,6,7,8,9 嗎?
是這樣理解??? 我存個10不行?

可能對這些概念很清晰的人會覺得這篇文章沒有意義,是的。我一開始直到剛才我還是這樣認為。

但是剛剛我身邊的 研發們無意討論這個事情,我才知道,原來不是應屆生,是很多搞了很多年的人原來都沒搞明白這些東西。

那麼我猜測是不是還有很多兄弟們是沒弄清晰的, 科普性的文章非常有必要。

正文

java 

int 的 範圍 :

首先   int             4   位元組  ;

一個位元組 8位元,  4×8 =32  位  ;

所以範圍大小是     -2^31~2^31 -1  (-2147483648 ~ 2147483647)  。

mysql

int 的 範圍 :

首先   int         4位元組  ;

一個位元組 8位元,  4×8 =32  bit  ;

所以範圍大小是     -2^31~2^31-1   (-2147483648 ~ 2147483647)  

注意了,對於mysql來說,int 預設是 這樣的。

但是還存在  unsigned(無符號)  int ,什麼意思呢,也就是無符號,將負的範圍分配到正去了,所以    unsigned(無符號)  int 的範圍大小 是  0 到4294967295    。

接下來到了很無語的  int(1) 環節 。。

首先我先說結論, int (1)  在mysql 裡面 是指 顯示 長度  !!! 

跟存值範圍沒半毛錢關係 !跟存值範圍沒半毛錢關係 !跟存值範圍沒半毛錢關係 !

建表 test  ,表結構 如 :

 存值, num 直接存入int (有符號) 的最大值 :  2147483647  

INSERT INTO `test` (`num`) VALUES (2147483647); 

 可以看到正常儲存, 而並不是說 int(1) 就 是 只能 存 1位整數............  希望之前還懵的人從此刻起,必須要糾正這個觀念了。 對於int型別,不要有這種錯誤的理念了!!!

ps : 存入一下更大的值  2147483648 ,可以看到提示超過範圍了  。

 然後可能有人有疑惑了,為什麼經常很多同事動不動就 int(10) int(11)呢?

ps: 包括我身邊的同事, 還會順口說一句, 10夠用了 ,11夠用了之類的話.......
也是讓人很無語呢。

 其實這10和11 來源也是有說法的,記得前文我說的,對於mysql 建立int 型別,預設就是有符號。 也就是說範圍在 -2147483648 ~ 2147483647  。

2147483647   長度 10 

-2147483648 長度 11 

所以 int (顯示長度)  弄 int (10 ) 和  int(11)  自然就知道是啥意思了。

那如果我就不用負數,要弄成 int (無符號)使用  ,怎麼操作? 

 alter test modify num int unsigned;

可以看到預設幫我們 int 改成無符號的 int時候,是int (10) ,這是最合理的。為什麼,還是因為這個顯示長度的概念, 無符號的int 範圍在   0 ~ 4294967295

4294967295   長度 10 ;

OK,我就是要違反這個預設給的10 , 我改成 int(1) :

alter test modify num int(1) unsigned;

 然後隨便插入一個值, 12345678 :

insert into  test (num) values (12345678);

沒錯,對於存在根本沒影響。

所以就是說, 我們要知道

int 型別欄位 ,在mysql 裡面 ,括號後面的 數位, 跟儲存的int 數值 範圍 

半毛錢關係沒有!!!

那至於就是想用的比較 安心一點(強迫症) ,

那如果是 預設int (預設是有符號),那你就int(11) 好了;

如果是    無符號 unsigned int ,那你就int (10) 好了。

但是我最後還是很倔強提一句,記住,半毛錢關係沒有!

最後給大家說一哈幾個小事,

① 最好在建表的時候就考慮好 int欄位是有符號還是無符號,或者說最大想要存入的值的範圍。

因為如果你一開始設定無符號  unsigned int ,存入了 大於 2147483647(有符號int的最大值),然後想調整 int欄位 從 無符號變成有符號, 這時候會報錯、 

② int 有符號不夠用,還可以用 bigint  8位元組,
8×8=64 位  ,-2^63~2^63-1  (-9223372036854775808~9223372036854775807) 

③ navicat上面 看 只顯示3位長度 這件事,不必糾結這個navicat 

navicat 操作介面 : 

官方也給過解釋:

MySQL Server 8.0.17 deprecated the display width for the TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT data types when the ZEROFILL modifier is not used, and MySQL Server 8.0.19 has removed the display width for those data types from results of SHOW CREATE TABLE, SHOW CREATE FUNCTION, and queries on INFORMATION_SCHEMA.COLUMNS, INFORMATION_SCHEMA.ROUTINES, and INFORMATION_SCHEMA.PARAMETERS (except for the display width for signed TINYINT(1)). This patch adjusts Connector/J to those recent changes of MySQL Server and, as a result, DatabaseMetaData, ParameterMetaData, and ResultSetMetaData now report identical results for all the above-mentioned integer types and also for the FLOAT and DOUBLE data types. (Bug #30477722)

從8.0.17版本開始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT型別的顯示寬度將失效。

總結

到此這篇關於Mysql中int(1)和int(11)的文章就介紹到這了,更多相關Mysql中int(1)和int(11)內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com