MySQL 截断不正确的 DOUBLE 值?

Posted

技术标签:

【中文标题】MySQL 截断不正确的 DOUBLE 值?【英文标题】:MySQL Truncated incorrect DOUBLE value? 【发布时间】: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 的转换 【参考方案1】:

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

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

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

【讨论】:

以上是关于MySQL 截断不正确的 DOUBLE 值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 DELETE 语句截断不正确的 DOUBLE 值

错误号:1292 在我的 SQL 错误中截断了不正确的 DOUBLE 值

数据截断:不正确的日期时间值:''

如何理解导致 MySQL 函数中截断不正确的双值错误的原因?

截断不正确的日期值

MySql 数据在第 1 行截断列“值”