我正在构建一个应用程序,它将使用马克斯明德GeoLite2 2城数据库。
通过遵循一个2016年年教程,我导入了GeoLite2-City块-ipv4.csv和GeoLite2-City-Locations-en.csv的数据,并添加了助手过程。现在,我可以成功地查询IP地址的位置信息,即IPv4。
但是我仍然需要能够查询IP地址的位置信息,即IPv6。我是否可以使用教程中的相同代码(如下所示)将IPv6的数据添加到现有的表中,而不会造成混乱?(我将文件路径更改为GeoLite2 2-City-Blocks ipv6.csv)
LOAD DATA LOCAL INFILE '/root/geoip/GeoLite2-City-CSV_20160503/GeoLite2-City-Blocks-IPv4.csv' INTO TABLE ip_blocks COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' IGNORE 1 LINES (
@network,
geoname_id,
registered_country_geoname_id,
represented_country_geoname_id,
is_anonymous_proxy,
is_satellite_provider,
postal_code,
latitude,
longitude,
accuracy_radius) SET
ip_from = INET_ATON(SUBSTRING(@network, 1, LOCATE('/', @network) - 1)),
ip_to = (INET_ATON(SUBSTRING(@network, 1, LOCATE('/', @network) - 1)) + (pow(2, (32-CONVERT(SUBSTRING(@network, LOCATE('/', @network) + 1), UNSIGNED INTEGER)))-1));发布于 2019-12-18 21:38:41
要直接回答您的问题,不行,您不能使用与IPv6版本完全相同的教程中的代码。
以下是几个原因:
LOAD DATA LOCAL INFILE查询使用MySQL的INET_ATON()函数,该函数不适用于IPv6。谢天谢地,MySQL还有另一个函数INET6_ATON(),它支持IPv4和IPv6,尽管它确实返回了不同的数据类型,即VARBINARY(16)而不是integer。把我带到第二点..。ip_blocks表是以ip_from和ip_to列作为int创建的,但如上所述,需要VARBINARY(16)与IPv6兼容。LOAD DATA LOCAL INFILE查询还执行一些整数运算,根据CSV中的CIDR范围计算最小和最大IP地址。这不适用于从INET6_ATON()函数返回的二进制格式。这些障碍大多源于IPv6地址空间比IPv4空间大得多(128位对32位),这意味着IPv6不能存储为正常整数。因此,您需要修改代码和底层存储以使其工作。
您可能可以使用MaxMind转换器工具从CSV中的IPv6范围获取一个min和最大IP地址,然后使用BETWEEN关键字查找该范围内的IP地址。有关背景信息,请参阅此问题:https://stackoverflow.com/questions/42414946/check-if-ipv6-is-inside-range
https://dba.stackexchange.com/questions/255870
复制相似问题