詳細(xì)深入聊一聊Mysql中的int(1)和int(11)
前言
首先在吐槽這個(gè)現(xiàn)象前,我先說下我們?cè)撈膬?nèi)容。
1. int 類型表字段 在mysql數(shù)據(jù)庫里面,到底存值的范圍是多少 ?
什么時(shí)候是 -2147483648到 2147483647
什么時(shí)候是 0 到4294967295
2. int (1) int(11) 這個(gè)括號(hào)后面的玩意,對(duì)于int來說 作用是什么?
int(1) 就只能存入 0,1,2,3,4,5,6,7,8,9 嗎?
是這樣理解??? 我存?zhèn)€10不行?
可能對(duì)這些概念很清晰的人會(huì)覺得這篇文章沒有意義,是的。我一開始直到剛才我還是這樣認(rèn)為。
但是剛剛我身邊的 研發(fā)們無意討論這個(gè)事情,我才知道,原來不是應(yīng)屆生,是很多搞了很多年的人原來都沒搞明白這些東西。
那么我猜測是不是還有很多兄弟們是沒弄清晰的, 科普性的文章非常有必要。
正文
java
int 的 范圍 :
首先 int 4 字節(jié) ;
一個(gè)字節(jié) 8位, 4×8 =32 位 ;
所以范圍大小是 -2^31~2^31 -1 (-2147483648 ~ 2147483647) 。
mysql
int 的 范圍 :
首先 int 4字節(jié) ;
一個(gè)字節(jié) 8位, 4×8 =32 bit ;
所以范圍大小是 -2^31~2^31-1 (-2147483648 ~ 2147483647)
注意了,對(duì)于mysql來說,int 默認(rèn)是 這樣的。
但是還存在 unsigned(無符號(hào)) int ,什么意思呢,也就是無符號(hào),將負(fù)的范圍分配到正去了,所以 unsigned(無符號(hào)) int 的范圍大小 是 0 到4294967295 。
接下來到了很無語的 int(1) 環(huán)節(jié) 。。
首先我先說結(jié)論, int (1) 在mysql 里面 是指 顯示 長度 ?。。?nbsp;
跟存值范圍沒半毛錢關(guān)系 !跟存值范圍沒半毛錢關(guān)系 !跟存值范圍沒半毛錢關(guān)系 !
建表 test ,表結(jié)構(gòu) 如 :
存值, num 直接存入int (有符號(hào)) 的最大值 : 2147483647
INSERT INTO `test` (`num`) VALUES (2147483647);?
可以看到正常存儲(chǔ), 而并不是說 int(1) 就 是 只能 存 1位整數(shù)............ 希望之前還懵的人從此刻起,必須要糾正這個(gè)觀念了。 對(duì)于int類型,不要有這種錯(cuò)誤的理念了?。?!
ps : 存入一下更大的值 2147483648 ,可以看到提示超過范圍了 。
然后可能有人有疑惑了,為什么經(jīng)常很多同事動(dòng)不動(dòng)就 int(10) int(11)呢?
ps: 包括我身邊的同事, 還會(huì)順口說一句, 10夠用了 ,11夠用了之類的話.......
也是讓人很無語呢。
其實(shí)這10和11 來源也是有說法的,記得前文我說的,對(duì)于mysql 創(chuàng)建int 類型,默認(rèn)就是有符號(hào)。 也就是說范圍在 -2147483648 ~ 2147483647 。
2147483647 長度 10
-2147483648 長度 11
所以 int (顯示長度) 弄 int (10 ) 和 int(11) 自然就知道是啥意思了。
那如果我就不用負(fù)數(shù),要弄成 int (無符號(hào))使用 ,怎么操作?
?alter test modify num int unsigned;
可以看到默認(rèn)幫我們 int 改成無符號(hào)的 int時(shí)候,是int (10) ,這是最合理的。為什么,還是因?yàn)檫@個(gè)顯示長度的概念, 無符號(hào)的int 范圍在 0 ~ 4294967295
4294967295 長度 10 ;
OK,我就是要違反這個(gè)默認(rèn)給的10 , 我改成 int(1) :
alter test modify num int(1) unsigned;
然后隨便插入一個(gè)值, 12345678 :
insert into ?test (num) values (12345678);
沒錯(cuò),對(duì)于存在根本沒影響。
所以就是說, 我們要知道
int 類型字段 ,在mysql 里面 ,括號(hào)后面的 數(shù)字, 跟存儲(chǔ)的int 數(shù)值 范圍
半毛錢關(guān)系沒有?。?!
那至于就是想用的比較 安心一點(diǎn)(強(qiáng)迫癥) ,
那如果是 默認(rèn)int (默認(rèn)是有符號(hào)),那你就int(11) 好了;
如果是 無符號(hào) unsigned int ,那你就int (10) 好了。
但是我最后還是很倔強(qiáng)提一句,記住,半毛錢關(guān)系沒有!
最后給大家說一哈幾個(gè)小事,
① 最好在建表的時(shí)候就考慮好 int字段是有符號(hào)還是無符號(hào),或者說最大想要存入的值的范圍。
因?yàn)槿绻阋婚_始設(shè)置無符號(hào) unsigned int ,存入了 大于 2147483647(有符號(hào)int的最大值),然后想調(diào)整 int字段 從 無符號(hào)變成有符號(hào), 這時(shí)候會(huì)報(bào)錯(cuò)、
② int 有符號(hào)不夠用,還可以用 bigint 8字節(jié),
8×8=64 位 ,-2^63~2^63-1 (-9223372036854775808~9223372036854775807)
③ navicat上面 看 只顯示3位長度 這件事,不必糾結(jié)這個(gè)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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL下使用Inplace和Online方式創(chuàng)建索引的教程
這篇文章主要介紹了MySQL下使用Inplace和Online方式創(chuàng)建索引的教程,針對(duì)InnoDB為存儲(chǔ)引擎的情況,需要的朋友可以參考下2015-11-11Centos7 安裝mysql 8.0.13(rpm)的教程詳解
這篇文章主要介紹了Centos7 安裝mysql 8.0.13(rpm)的教程詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11MySQL中having和where的區(qū)別及應(yīng)用詳解
這篇文章主要給大家詳細(xì)介紹了MySQL中having和where的區(qū)別以及他們的使用方法,文中有相關(guān)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下2023-06-06Centos中徹底刪除Mysql(rpm、yum安裝的情況)
這篇文章主要介紹了Centos中徹底刪除Mysql(rpm、yum安裝的情況),本文直接給出操作代碼,需要的朋友可以參考下2015-02-02MySQL中因字段字符集不同導(dǎo)致索引不能命中的解決方法
這篇文章主要給大家介紹了關(guān)于MySQL中因字段字符集不同導(dǎo)致索引不能命中的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Mysql分區(qū)表和普通表互轉(zhuǎn)的實(shí)現(xiàn)示例
本文主要介紹了Mysql分區(qū)表和普通表互轉(zhuǎn)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02如何使用mysqladmin獲取一個(gè)mysql實(shí)例當(dāng)前的TPS和QPS
這篇文章主要介紹了如何使用mysqladmin這個(gè)工具來獲取一個(gè)mysql實(shí)例當(dāng)前的TPS和QPS,幫助大家更好的管理數(shù)據(jù)庫,感興趣的朋友可以了解下2020-11-11MySQL線程處于Opening tables的問題解決方法
在本篇文章里小編給大家分享了關(guān)于MySQL線程處于Opening tables的問題解決方法,有興趣的朋友們學(xué)習(xí)下。2019-01-01MySQL中 and or 查詢的優(yōu)先級(jí)分析
這個(gè)可能是容易被忽略的問題,首選我們要清楚,MySQL中,AND的執(zhí)行優(yōu)先級(jí)高于OR。也就是說,在沒有小括號(hào)()的限制下,總是優(yōu)先執(zhí)行AND語句,再執(zhí)行OR語句2021-03-03