0

我已经下载了 Software77 的免费 geoip country DB。我已经使用 Sequel Pro 导入了它——结果表看起来与 .csv 中的行数相同。

但是,以下查询返回 0 个结果:

SELECT * FROM s77_country WHERE ip_num_start = "3000762368";
SELECT country_code FROM s77_country WHERE 3000831958 BETWEEN ip_num_start AND ip_num_end

在 .csv 中,第 49046 行:

"3000762368","3001024511","ripencc","1269993600","RS","SRB","Serbia"

这看起来在范围内,所以结果应该是“RS”。

这是表设置:

CREATE TABLE `s77_country` (
  `ip_num_start` int(11) DEFAULT NULL,
  `ip_num_end` int(11) DEFAULT NULL,
  `registry` varchar(255) DEFAULT NULL,
  `assigned` bigint(11) DEFAULT NULL,
  `country_code` varchar(255) DEFAULT NULL,
  `country_code_long` varchar(255) DEFAULT NULL,
  `country_name` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

我在这里想念什么?

4

2 回答 2

1

您需要使用BIGINTint unsigned为您的 IP_NUM。IP num 值高于 2b,INT 被限制在那里

IP_NUM 的最大值理论上是 255*256^3+255*256^2+255*256+255,即 4294967295,是有符号 int 可以存储的两倍

http://dev.mysql.com/doc/refman/5.0/en/integer-types.html

编辑: int unsigned 完全符合该值

于 2013-10-10T12:39:04.467 回答
1

实际上你已经错过了一个阶段的错误。

该值3000831958不在 的范围内int。使用bigint(11)orint(11) unsigned代替两者 forip_num_startip_num_end

由于范围冲突,您指定的记录甚至不会插入到表中。

您的选择查询很好。

于 2013-10-10T12:49:16.010 回答