IP版本6有一个简单的IP到国家/地区数据库 http://www.ip2location.com/free/ipv6
CREATE TABLE `ip2location_ipv6`(
`ip_from` DOUBLE,
`ip_to` DOUBLE,
`ipv6_from` VARCHAR(40),
`ipv6_to` VARCHAR(40),
`country_code` CHAR(2),
`country_name` VARCHAR(64),
INDEX `idx_ip_from` (`ip_from`),
INDEX `idx_ip_to` (`ip_to`),
INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
此db的示例行值:
"42540528726795050063891204319802818560", "42540528806023212578155541913346768895", "2001:200::", "2001:200:ffff:ffff:ffff:ffff:ffff:ffff", "JP", "Japan"
现在我想获得一个IP地址的国家名称。这是我的SQL:
SQL = "SELECT country_code FROM ip2location_ipv6 WHERE " & IPNumber & " BETWEEN ip_from AND ip_to"
在这个sql中有一个名为IPNumber的参数。在IPV4中,我可以轻松地计算IPNumber。
IPV4: a.b.c.d => IPNumber = a*(256*256*256) + b*(256*256) + C*(256) + d
或者我可以做到
IPNumber = (long)(uint)IPAddress.NetworkToHostOrder((int)IPAddress.Parse("IP_address_Version_4").Address);
但我在C#中没有任何IPV6解决方案。例如,它想在这个数据库中找到此IP“2001:DB8 :: dcaf:BAD”的国家名称
答案 0 :(得分:1)
要从二进制转换为标准IPv6表示法:
将IPAddress
课程与public IPAddress(byte[] address)
constructor一起使用。
在构造函数中传入IPv6地址的字节数组,然后使用.ToString()
方法print it in standard notation。
要从标准IPv6表示法转换为二进制:
创建一个新的IPAddress
对象,并使用IPAddress.TryParse(string standardNotation)
将标准符号字符串转换为二进制值。
答案 1 :(得分:0)
您可以使用最新版本的mysql 5.6它已经支持IPv6并命令INET6_ATON(),INET6_NTOA()。
你的桌子将是 -
CREATE TABLE `ip2location_ipv6`(
`ip_from` int(11) unsigned,
`ip_to` int(11) unsigned,
`ipv6_from` varbinary(16),
`ipv6_to` varbinary(16),
`country_code` CHAR(2),
`country_name` VARCHAR(64),
INDEX `idx_ip_from` (`ip_from`),
INDEX `idx_ip_to` (`ip_to`),
INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;