例如,我有一个列存储这样的数据。
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()
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 |
+----------------------------+
关于mysql - 如何在mysql中匹配一个ip地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14699056/