[英]Mysql compare ip address
我有一個存儲 IP 地址及其位置的數據庫。 我只在表中存儲 IP 地址的前 3 個網絡 ID。
+-------------------+-----------------+
|ip_address(varchar)|location(varchar)|
+-------------------+-----------------+
| 1.2.3 | A |
| 1.2.4 | A |
| 1.22.33 | B |
| 1.100.99 | C |
+-------------------+-----------------+
假設我的 IP 是 1.2.3.4 或其他 1.100.99.20,我如何將 IP 與表進行比較以獲取位置?
這是一個應該有效並且也可以索引的解決方案:
SELECT location
FROM WhateverTable
WHERE ip_address = SUBSTRING_INDEX(?, '.', 3)
您在哪里為?
范圍。
您應該知道您存儲的 IP 地址具有誤導性。 官方 IP 地址格式允許縮短字符串,但不是您想的那樣。 例如:
mysql> select inet_ntoa(inet_aton('1.100.99'));
+----------------------------------+
| inet_ntoa(inet_aton('1.100.99')) |
+----------------------------------+
| 1.100.0.99 |
+----------------------------------+
我打賭你會期望它返回 1.100.99.0。
SELECT location
FROM address_table
WHERE AND INET_ATON(@my_address) BETWEEN INET_ATON(CONCAT(ip_address, '.0'))
AND INET_ATON(CONCAT(ip_address, '.255'))
當然這個查詢不能使用索引,即使它存在......
我建議您不要修剪 ip_address 列值。 最好的方法是以數字形式將未修剪的子網地址而是 IP 地址范圍(從 - 到)存儲在兩列中 - 這可以防止拼寫錯誤(並減少行數)。 如果需要,您可以使用帶有 IP 地址范圍字符串表示的生成列。
這不是最實用的方法,但它確實有效。
我們可以使用LOCATE()
函數,它接受兩個參數,分別代表您要查找的子字符串和要在其中查找的字符串。 (定位函數參考: https : //www.oreilly.com/library/view/mysql-cookbook/0596001452/ch04s06.html )
要傳遞的第一個參數是列ip_address
,第二個參數將是您的 IP(例如:1.2.3.4)。
SELECT location
FROM that_table
WHERE LOCATE(ip_address, 'the_ip') >= 1;
如果我們得到的數字大於或等於 1,則意味着它找到了匹配項,因此該 ip 將有一個位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.