gpt4 book ai didi

php - 如何在 MySQL 中存储(和查找)带有通配符的字符串?

转载 作者:可可西里 更新时间:2023-11-01 07:05:28 26 4
gpt4 key购买 nike

我需要存储一个带有通配符的 IP 地址,例如 10.0.%.1。然后,我希望从我的查询中找到 IP 地址在允许范围 (10.0.0-255.1) 内的任何人。

你们能帮帮我吗?我试过存储 10.0.%.1,但无法使用 LIKE 查询找到它(我什至不知道这是否是实现它的方法 - 可能不是)。

提前致谢。

最佳答案

将 IP 地址转换为 32 位整数,并为地址和掩码创建一列。您可以使用 INET_NTOA()INET_ATON() 函数。您的 10.0.%.1 范围可以表示为网络 10.0.0.1,掩码为 255.255.0.255。要查看给定 IP 地址是否与该网络匹配,您可以将掩码应用于 IP 地址,并将其与网络地址进行比较。如果它们匹配,则该地址在网络中。例如,如果您想测试 10.0.4.1,您可以使用按位与将掩码应用于它:

10.0.4.1 & 255.255.0.255 = 10.0.0.1

这与您的网络地址匹配,因此该 IP 在网络中。

您可以像这样将此网络存储在您的表中(ip 和掩码是整数):

CREATE TABLE networks (id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, ip INT, mask INT);

INSERT INTO networks (ip, mask)
VALUES (INET_ATON('10.0.0.1'), INET_ATON('255.255.0.255'));

您可以找到给定的 IP (10.0.23.1) 是否匹配,如下所示:

SELECT * FROM networks
WHERE ip & mask = INET_ATON('10.0.23.1') & mask

不过,如果您希望它们可供人类阅读,这会将 IP 选择为整数:

SELECT id, INET_NTOA(ip) AS ipstring, INET_NTOA(mask) AS maskstring
FROM networks
WHERE ip & mask = INET_ATON('10.0.23.1') & mask

这使您可以测试给定的单个 IP 地址是否与网络匹配。如果您想测试一系列 IP,则必须将掩码应用于该范围内的每个 IP,并按上述方法测试每个 IP。您可以在单个查询中完成,它只需要列出您正在测试的每个 IP 地址。

关于php - 如何在 MySQL 中存储(和查找)带有通配符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12672702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com