詳細深入聊一聊Mysql中的int(1)和int(11)
前言
首先在吐槽這個現(xiàn)象前,我先說下我們該篇的內(nèi)容。
1. int 類型表字段 在mysql數(shù)據(jù)庫里面,到底存值的范圍是多少 ?
什么時候是 -2147483648到 2147483647
什么時候是 0 到4294967295
2. int (1) int(11) 這個括號后面的玩意,對于int來說 作用是什么?
int(1) 就只能存入 0,1,2,3,4,5,6,7,8,9 嗎?
是這樣理解??? 我存?zhèn)€10不行?
可能對這些概念很清晰的人會覺得這篇文章沒有意義,是的。我一開始直到剛才我還是這樣認為。
但是剛剛我身邊的 研發(fā)們無意討論這個事情,我才知道,原來不是應(yīng)屆生,是很多搞了很多年的人原來都沒搞明白這些東西。
那么我猜測是不是還有很多兄弟們是沒弄清晰的, 科普性的文章非常有必要。
正文
java
int 的 范圍 :
首先 int 4 字節(jié) ;
一個字節(jié) 8位, 4×8 =32 位 ;
所以范圍大小是 -2^31~2^31 -1 (-2147483648 ~ 2147483647) 。
mysql
int 的 范圍 :
首先 int 4字節(jié) ;
一個字節(jié) 8位, 4×8 =32 bit ;
所以范圍大小是 -2^31~2^31-1 (-2147483648 ~ 2147483647)
注意了,對于mysql來說,int 默認是 這樣的。
但是還存在 unsigned(無符號) int ,什么意思呢,也就是無符號,將負的范圍分配到正去了,所以 unsigned(無符號) int 的范圍大小 是 0 到4294967295 。
接下來到了很無語的 int(1) 環(huán)節(jié) 。。
首先我先說結(jié)論, int (1) 在mysql 里面 是指 顯示 長度 ?。?!
跟存值范圍沒半毛錢關(guān)系 !跟存值范圍沒半毛錢關(guān)系 !跟存值范圍沒半毛錢關(guān)系 !
建表 test ,表結(jié)構(gòu) 如 :

存值, num 直接存入int (有符號) 的最大值 : 2147483647
INSERT INTO `test` (`num`) VALUES (2147483647);?

可以看到正常存儲, 而并不是說 int(1) 就 是 只能 存 1位整數(shù)............ 希望之前還懵的人從此刻起,必須要糾正這個觀念了。 對于int類型,不要有這種錯誤的理念了?。。?/p>
ps : 存入一下更大的值 2147483648 ,可以看到提示超過范圍了 。

然后可能有人有疑惑了,為什么經(jīng)常很多同事動不動就 int(10) int(11)呢?
ps: 包括我身邊的同事, 還會順口說一句, 10夠用了 ,11夠用了之類的話.......
也是讓人很無語呢。
其實這10和11 來源也是有說法的,記得前文我說的,對于mysql 創(chuàng)建int 類型,默認就是有符號。 也就是說范圍在 -2147483648 ~ 2147483647 。
2147483647 長度 10
-2147483648 長度 11
所以 int (顯示長度) 弄 int (10 ) 和 int(11) 自然就知道是啥意思了。
那如果我就不用負數(shù),要弄成 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 里面 ,括號后面的 數(shù)字, 跟存儲的int 數(shù)值 范圍
半毛錢關(guān)系沒有?。。?/strong>
那至于就是想用的比較 安心一點(強迫癥) ,
那如果是 默認int (默認是有符號),那你就int(11) 好了;
如果是 無符號 unsigned int ,那你就int (10) 好了。
但是我最后還是很倔強提一句,記住,半毛錢關(guān)系沒有!
最后給大家說一哈幾個小事,
① 最好在建表的時候就考慮好 int字段是有符號還是無符號,或者說最大想要存入的值的范圍。
因為如果你一開始設(shè)置無符號 unsigned int ,存入了 大于 2147483647(有符號int的最大值),然后想調(diào)整 int字段 從 無符號變成有符號, 這時候會報錯、
② int 有符號不夠用,還可以用 bigint 8字節(jié),
8×8=64 位 ,-2^63~2^63-1 (-9223372036854775808~9223372036854775807)
③ navicat上面 看 只顯示3位長度 這件事,不必糾結(jié)這個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類型的顯示寬度將失效。
總結(jié)
到此這篇關(guān)于Mysql中int(1)和int(11)的文章就介紹到這了,更多相關(guān)Mysql中int(1)和int(11)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫INNODB表損壞修復(fù)處理過程分享
突然收到MySQL報警,從庫的數(shù)據(jù)庫掛了,一直在不停的重啟,打開錯誤日志,發(fā)現(xiàn)有張表壞了。innodb表損壞不能通過repair table 等修復(fù)myisam的命令操作?,F(xiàn)在記錄下解決過程2013-08-08
MySQL通過login_path登錄數(shù)據(jù)庫的實現(xiàn)示例
login_path是MySQL5.6開始支持的新特性,本文主要介紹了MySQL通過login_path登錄數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
mysql 5.7.13 安裝配置方法圖文教程(linux)
這篇文章主要為大家詳細介紹了linux下mysql 5.7.13 安裝配置方法圖文教程,感興趣的小伙伴們可以參考一下2016-06-06
淺談Mysql連接數(shù)據(jù)庫時host和user的匹配規(guī)則
這篇文章主要介紹了淺談Mysql連接數(shù)據(jù)庫時host和user的匹配規(guī)則,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

