在线乱码卡一卡二卡新HD,最近韩国免费观看视频,国产色无码精品视频国产,亚洲男人的天堂久久香蕉

我懵了,如果要存 IP 地址,用什么數據類型比較好?_世界視訊
來源:飛天小牛肉    時間:2023-04-27 07:58:00

提到 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 的壓力。

關鍵詞:

X 關閉

X 關閉

<蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>