你需要使用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 |
+