【发布时间】:2013-08-03 16:20:23
【问题描述】:
我在 MySQL 中有一个 GeoIP 表。
IP 范围用BINARY(16) 定义。
当我通过查询查找 IP 地址时:
SELECT `countries_countryID` FROM `geoIP` WHERE INET_ATON("84.224.199.84") BETWEEN `geoIP`.`ipFrom` AND `geoIP`.`ipTo` LIMIT 1;
我收到警告消息 (20-30000),说:"Truncated incorrect DOUBLE value: '17498112\x00\x00\x00\x00\x00\x00\x00\x00'"
桌子:
DROP TABLE IF EXISTS `geoIP` ;
CREATE TABLE IF NOT EXISTS `geoIP` (
`geoIPID` INT NOT NULL AUTO_INCREMENT ,
`IPFrom` BINARY(16) NOT NULL ,
`IPTo` BINARY(16) NOT NULL ,
`countries_countryID` INT NOT NULL ,
PRIMARY KEY (`geoIPID`) ,
INDEX `fk_geoIP_countries1_idx` (`countries_countryID` ASC) ,
INDEX `IPTo_INDEX` (`IPTo` ASC) ,
INDEX `IPFrom_INDEX` (`IPFrom` ASC) ,
CONSTRAINT `fk_geoIP_countries1`
FOREIGN KEY (`countries_countryID` )
REFERENCES `countries` (`countryID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
结果正确,国家代码正确返回,但是有这些警告信息。怎么了?
【问题讨论】:
-
为什么使用
binary作为 IP 地址?对于 IPv6? -
它占用的空间更少,以后我也会实现 IPv6,这需要 BINARY(16)。
-
Inet_aton 返回一个 int,然后您在两个二进制文件之间使用它。老实说,它甚至可以正常工作,我感到惊讶,我本以为它会炸成碎片。看起来你需要做一些 IPFrom 和 To 的转换