Mysql比较ip地址
Mysql compare ip address
我有一个存储 IP 地址及其位置的数据库。我只在 table.
中存储 IP 地址的前 3 个网络 ID
+-------------------+-----------------+
|ip_address(varchar)|location(varchar)|
+-------------------+-----------------+
| 1.2.3 | A |
| 1.2.4 | A |
| 1.22.33 | B |
| 1.100.99 | C |
+-------------------+-----------------+
假设我的 IP 是 1.2.3.4 或其他 1.100.99.20,我如何将 IP 与 table 进行比较以获得位置?
这不是最实用的方法,但它确实有效。
我们可以使用 LOCATE()
函数,它有两个参数,分别代表您要查找的子字符串和要查找的字符串。 (定位函数参考:https://www.oreilly.com/library/view/mysql-cookbook/0596001452/ch04s06.html)
要传递的第一个参数是 ip_address
列,第二个参数将是您的 IP(例如:1.2.3.4)。
SELECT location
FROM that_table
WHERE LOCATE(ip_address, 'the_ip') >= 1;
如果我们得到的数字大于或等于 1,则意味着它找到了匹配项,因此该 ip 将有一个位置。
这里有一个应该可以工作并且也可以索引的解决方案:
SELECT location
FROM WhateverTable
WHERE ip_address = SUBSTRING_INDEX(?, '.', 3)
您为 ?
参数提供值“1.100.99.20”。
您应该知道您存储的 IP 地址具有误导性。官方 IP 地址格式允许缩短字符串,但不是您可能想的那样。例如:
mysql> select inet_ntoa(inet_aton('1.100.99'));
+----------------------------------+
| inet_ntoa(inet_aton('1.100.99')) |
+----------------------------------+
| 1.100.0.99 |
+----------------------------------+
我打赌你会期望它 return 1.100.99.0.
SELECT location
FROM address_table
WHERE AND INET_ATON(@my_address) BETWEEN INET_ATON(CONCAT(ip_address, '.0'))
AND INET_ATON(CONCAT(ip_address, '.255'))
当然这个查询不能使用索引,即使它存在...
我建议您不要 trim ip_address 列值。最好的方法不是 trimmed 子网地址,而是 IP 地址范围(从 - 到)以数字形式存储在两列中 - 这可以防止拼写错误(并减少行数)。如果需要,您可以使用带有 IP 地址范围字符串表示的生成列。
我有一个存储 IP 地址及其位置的数据库。我只在 table.
中存储 IP 地址的前 3 个网络 ID+-------------------+-----------------+
|ip_address(varchar)|location(varchar)|
+-------------------+-----------------+
| 1.2.3 | A |
| 1.2.4 | A |
| 1.22.33 | B |
| 1.100.99 | C |
+-------------------+-----------------+
假设我的 IP 是 1.2.3.4 或其他 1.100.99.20,我如何将 IP 与 table 进行比较以获得位置?
这不是最实用的方法,但它确实有效。
我们可以使用 LOCATE()
函数,它有两个参数,分别代表您要查找的子字符串和要查找的字符串。 (定位函数参考:https://www.oreilly.com/library/view/mysql-cookbook/0596001452/ch04s06.html)
要传递的第一个参数是 ip_address
列,第二个参数将是您的 IP(例如:1.2.3.4)。
SELECT location
FROM that_table
WHERE LOCATE(ip_address, 'the_ip') >= 1;
如果我们得到的数字大于或等于 1,则意味着它找到了匹配项,因此该 ip 将有一个位置。
这里有一个应该可以工作并且也可以索引的解决方案:
SELECT location
FROM WhateverTable
WHERE ip_address = SUBSTRING_INDEX(?, '.', 3)
您为 ?
参数提供值“1.100.99.20”。
您应该知道您存储的 IP 地址具有误导性。官方 IP 地址格式允许缩短字符串,但不是您可能想的那样。例如:
mysql> select inet_ntoa(inet_aton('1.100.99'));
+----------------------------------+
| inet_ntoa(inet_aton('1.100.99')) |
+----------------------------------+
| 1.100.0.99 |
+----------------------------------+
我打赌你会期望它 return 1.100.99.0.
SELECT location
FROM address_table
WHERE AND INET_ATON(@my_address) BETWEEN INET_ATON(CONCAT(ip_address, '.0'))
AND INET_ATON(CONCAT(ip_address, '.255'))
当然这个查询不能使用索引,即使它存在...
我建议您不要 trim ip_address 列值。最好的方法不是 trimmed 子网地址,而是 IP 地址范围(从 - 到)以数字形式存储在两列中 - 这可以防止拼写错误(并减少行数)。如果需要,您可以使用带有 IP 地址范围字符串表示的生成列。