例如,我有一个列存储这样的数据。
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
答案 0 :(得分:13)
您需要使用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()
function将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 |
+----------------------------+
答案 1 :(得分:3)
这可能不是最有效的方式,它在技术上不是正则表达式,但应该有效:
SELECT col1 FROM t1 WHERE col1 LIKE '%.%.%.%';
答案 2 :(得分:2)
你也可以使用有用的函数inet_aton()
SELECT *
FROM yourtable
WHERE inet_aton(thecolumn) is not null
答案 3 :(得分: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])$';
答案 4 :(得分:1)
IS_IPV4()
是本机mysql函数,可让您检查值是否为有效的IP版本4。
SELECT *
FROM ip_containing_table
WHERE IS_IPV4(ip_containing_column);
我没有数据,但是我认为这必须是最可靠,最有效的方法。
还有类似的本机功能可以检查IP版本6等。