如何在mysql中匹配ip地址?

Abb*_*Hoi 7 regex mysql

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

Apple
12.5.126.40
Smite
Abby
127.0.0.1
56.5.4.8
9876543210
Notes
Run Code Online (Sandbox Code Playgroud)

如何只选择IP格式数据的行?

我试过 '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' 但我不知道为什么它也匹配9876543210

Mic*_*ski 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}$'
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这将匹配非有效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 |
+------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

另一种方法是尝试通过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 |
+----------------------------+
Run Code Online (Sandbox Code Playgroud)

  • @AbbyChauYuHoi加倍反斜杠.我总是忘记在处理MySQL中的正则表达式时. (2认同)

kev*_*kev 7

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

SELECT *
FROM ip_containing_table
WHERE IS_IPV4(ip_containing_column);
Run Code Online (Sandbox Code Playgroud)

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

还有类似的本机函数可以检查 IP 版本 6 等。