MySQL截断了不正确的DOUBLE值?

时间:2013-08-03 16:20:24

标签: mysql geoip

我在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;

结果是正确的,国家代码是正确返回的,但是有警告消息。有什么问题?

1 个答案:

答案 0 :(得分:0)

如果您要在同一字段中存储IPv6和IPv4,则应在表定义中使用VARBINARY(16)而不是BINARY(16)。这将删除警告。

在MySQL中,BINARY字段(很像CHAR字段)是固定宽度并且是正确填充的。您可以在警告中看到填充。比较是在DOUBLE(IP)和1/2的BINARY(16)之间,右半部分被截断。这就是你收到警告的原因。

http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html