在MySQL中存儲和檢索IP地址的最有效方式是什麼?現在我在做:在MySQL中存儲IP地址的最有效方式
SELECT * FROM logins WHERE ip = '1.2.3.4'
其中ip是一個VARCHAR(15)
字段。
有沒有更好的方法來做到這一點?
在MySQL中存儲和檢索IP地址的最有效方式是什麼?現在我在做:在MySQL中存儲IP地址的最有效方式
SELECT * FROM logins WHERE ip = '1.2.3.4'
其中ip是一個VARCHAR(15)
字段。
有沒有更好的方法來做到這一點?
爲IPv4 addresses,你可能需要將它們存儲爲一個int unsigned
,並使用INET_ATON()
和INET_NTOA()
功能,從它的數值返回的IP地址,反之亦然。
例子:
SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
| 2130706433 |
+------------------------+
1 row in set (0.00 sec)
SELECT INET_NTOA('2130706433');
+-------------------------+
| INET_NTOA('2130706433') |
+-------------------------+
| 127.0.0.1 |
+-------------------------+
1 row in set (0.02 sec)
也許將整數值直接存儲在整數字段中?一個IP地址基本上是4「短褲」。
檢查出來:http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip
所以他會把它存儲在四個領域?他們會是字節,不是?每次2^8 或者,他可以將它們轉換爲十進制數並存儲小數,儘管這將是一個更大的字段,它將是一個字段。 – jcolebrand 2010-03-29 23:55:04
更合適的方言將是IP地址是4個字節。 – 2010-03-29 23:58:30
我明白了。布賴恩的說法是,概念上的一個整數由四個短褲組成。短是一個字節。一個int是4個字節。如本頁其他地方所說,它需要是一個unsigned int。 – joe 2016-02-29 23:59:43
如果你只是想存儲IPv4地址,那麼你可以將它們存儲在一個32位整型字段。
如果你也想支持IPv6,那麼一個字符串可能是最易於閱讀/使用的方式(儘管你可以在技術上將它們存儲在一個16字節的VARBINARY()
字段中,但如果試圖生成SQL語句可通過IP地址「手動」進行選擇)
無論您使用什麼最簡單的方法。除非您知道這是分析問題,否則大小或速度問題不是問題。在某些情況下,如果需要進行部分匹配,字符串可能更容易處理。但作爲空間或性能問題,除非您真的有理由擔心它,否則不要擔心。
好的,所以你的程序壞掉了,或者根本不能用IPv6 ......嘆氣。 – Juliano 2010-03-29 23:55:22