提到 IP 地址(IPv4),大伙兒腦子里肯定馬上能浮現類似于192.168.0.1、127.0.0.1這種常見的 IP 地址,然后結合這個問題 “MySQL 中用什么數據類型存 IP 地址?”,于是乎脫口而出用char字符串類型存。
面試官一臉冷漠,你頓時意識到情況不對,又仔細琢磨了一下。
然后發現,這個 IP 地址的長度是變化的,最短可以是0.0.0.0只需要 7 位,最長可以是255.255.255.255需要 15 位,于是自信地回答使用varchar(15)來存儲 IP 地址,并為自己能夠想到這一層而暗自竊喜。
(資料圖片)
誰知面試官竟輕蔑一笑,問你 “確定嗎?”,你覺得這是面試官在考驗你,于是堅定的回答 “確定”。
然后就開始了下一題
......
人們經常使用varchar(15)列來存儲 IP 地址,但事實上這并不是最優解。
IP 地址的本質是32 位無符號整數,類似于192.168.0.1這種點分十進制的字符串寫法只是為了幫助人們理解和記憶,192.168.0.1對應的十進制表示是 無符號整數3232235521。
所以,說用字符串類型存 IP 地址的,其實是潛意識中以為 IP 地址是字符串,存的是點分十進制的字符串,但正確的應該是存 32 位的無符號整數
所謂有符號數其實就是將最高位作為符號位,比如 32 位的有符號 INT,最高位是符號位,剩下 31 位才是真實的數值,所以有符號 INT 的取值區間為:
無符號 INT 的取值區間為:
下表列出了 MySQL 出各個整數類型有符號和無符號的的取值范圍,在定義表時,可以在數據類型后面添加關鍵字UNSIGNED來定義無符號整數,否則默認為有符號整數:
類型 | 有符號數取值范圍 | 無符號數取值范圍 |
TINYINT(1 字節,8 bit) | -128 ? 127 | 0 ? 255 |
SMALLINT(2 字節,16 bit) | -32768 ? 32767 | 0 ? 65535 |
MEDIUMINT(3 字節,24 bit) | -8388608 ? 8388607 | 0 ? 16777215 |
INT(4 字節,32 bit) | -2147483648 ? 2147483647 | 0 ? 4294967295 |
BIGINT(8 字節,64 bit) | -9223372036854775808 ? 9223372036854775807 | 0 ? 18446744073709551615 |
結合上表,可以看出,32 位的無符號 INT正好可以容納 IPv4 地址,下面是INT UNSIGNED和VARCHAR(15)兩種數據類型的對比:
存儲空間:4 字節的INT類型 15 字節的 VARCHAR(15)更加節省存儲空間。另外,VARCHAR 除了會保存需要的字符數,還會另加一個字節來記錄長度(如果列聲明的長度超過 255,則使用兩個字節記錄長度),所以VARCHAR(15)其實要占用 16 個字節。檢索速度:如果我們要在 IP 地址上建立索引,那么對于字符串索引來說,整數索引的檢索速度簡直就是降緯打擊了,因為字符串類型的比較是需要從第一位字符開始遍歷依次進行的,速度較慢。MySQL 非常貼心地提供了 IPv4 地址點分十進制和無符號整數的相互轉換函數,inet_aton和inet_ntoa(底層是二進制移位操作,速度很快):
當然你更應該在業務中去執行這些轉換,減輕 MySQL 的壓力。
關鍵詞:
上一篇:全球5G市場最新進展及未來展望
下一篇:最后一頁
X 關閉
X 關閉
- 15G資費不大降!三大運營商誰提供的5G網速最快?中國信通院給出答案
- 2聯想拯救者Y70發布最新預告:售價2970元起 迄今最便宜的驍龍8+旗艦
- 3亞馬遜開始大規模推廣掌紋支付技術 顧客可使用“揮手付”結賬
- 4現代和起亞上半年出口20萬輛新能源汽車同比增長30.6%
- 5如何讓居民5分鐘使用到各種設施?沙特“線性城市”來了
- 6AMD實現連續8個季度的增長 季度營收首次突破60億美元利潤更是翻倍
- 7轉轉集團發布2022年二季度手機行情報告:二手市場“飄香”
- 8充電寶100Wh等于多少毫安?鐵路旅客禁止、限制攜帶和托運物品目錄
- 9好消息!京東與騰訊續簽三年戰略合作協議 加強技術創新與供應鏈服務
- 10名創優品擬通過香港IPO全球發售4100萬股 全球發售所得款項有什么用處?