簡體   English   中英

Mysql比較ip地址

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM