簡體   English   中英

如何在mysql中匹配IP地址?

[英]How to match an ip address in mysql?

例如,我有一列存儲這樣的數據。

Apple
12.5.126.40
Smite
Abby
127.0.0.1
56.5.4.8
9876543210
Notes

如何只選擇IP格式的數據行?

我已經嘗試過使用'^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$'但我不知道為什么它也匹配9876543210

您將需要使用REGEXP來匹配IP地址點分四邊形圖案。

SELECT *
FROM yourtable
WHERE 
  thecolumn REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$'

從技術上講,這將匹配不是有效IP地址的值,例如999.999.999.999 ,但這可能並不重要。 什么重要的,是修復你的數據,使得IP地址存儲在自己的列從你這里的任何其他數據分開。 在一個列中混合使用數據類型幾乎總是一個壞主意。

mysql> SELECT '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+---------------------------------------------------------------------------+
| '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+---------------------------------------------------------------------------+
|                                                                         0 |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+------------------------------------------------------------------------------+
| '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+------------------------------------------------------------------------------+
|                                                                            1 |
+------------------------------------------------------------------------------+

另一種方法是嘗試通過MySQL的INET_ATON()函數將IP地址轉換為長整數。 無效的地址將返回NULL

該方法可能比正則表達式更有效。

您可以將其嵌入以下WHERE條件中: WHERE INET_ATON(thecolumn) IS NOT NULL

SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 |
+------------------------+

SELECT INET_ATON('notes');
+--------------------+
| INET_ATON('notes') |
+--------------------+
|               NULL |
+--------------------+

SELECT INET_ATON('56.99.9999.44');
+----------------------------+
| INET_ATON('56.99.9999.44') |
+----------------------------+
|                       NULL |
+----------------------------+

這可能不是最有效的方法,並且從技術上講不是正則表達式,但是它應該可以工作:

SELECT col1 FROM t1 WHERE col1 LIKE '%.%.%.%';

您還可以使用有用的函數inet_aton()

SELECT *
FROM yourtable
WHERE inet_aton(thecolumn) is not null

冗長,但效果很好:

mysql> SELECT '1.0.0.127' regexp '^([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$';

IS_IPV4()是本地mysql函數,可讓您檢查值是否為有效的IP版本4。

SELECT *
FROM ip_containing_table
WHERE IS_IPV4(ip_containing_column);

我沒有數據,但是我認為這必須是最可靠,最有效的方法。

還有類似的本機功能可以檢查IP版本6等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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