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