10

例如,我有一个存储这样的数据的列。

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

4

5 回答 5

17

您将需要使用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 |
+----------------------------+
于 2013-02-05T02:14:36.880 回答
4

IS_IPV4()是一个本地 mysql 函数,可让您检查值是否是有效的 IP 版本 4。

SELECT *
FROM ip_containing_table
WHERE IS_IPV4(ip_containing_column);

我没有数据,但我认为这一定是最可靠、最有效的方法。

还有类似的本机功能检查 IP 版本 6 等。

于 2019-02-12T14:22:35.170 回答
3

这可能不是最有效的方法,而且它在技术上不是正则表达式,但它应该可以工作:

SELECT col1 FROM t1 WHERE col1 LIKE '%.%.%.%';
于 2013-02-05T02:14:18.777 回答
2

您还可以使用有用的功能 inet_aton()

SELECT *
FROM yourtable
WHERE inet_aton(thecolumn) is not null
于 2013-11-13T08:37:34.983 回答
1

冗长但工作正常:

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])$';
于 2015-05-13T08:52:25.217 回答