我有以下MySQL数据库表:
CREATE TABLE `example` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`ip` BIGINT(11) NOT NULL,
`ipv6` VARBINARY(16) NOT NULL
PRIMARY KEY (`id`)
);
我的目标只是在新的ipv6
列中将现有的IPv4 IP地址复制/转换为IPv6格式。所以我运行以下查询,在我的所有测试用例中都运行良好:
UPDATE example SET ipv6 = INET6_ATON(INET_NTOA(ip));
这个应该简单吗?否...处理1,083条记录后,MariaDB返回以下错误:
列'ipv6'不能为空。
我在想奇怪所以我决定开始验证数据:
ip
列的值,因此看起来不错。所以我向下滚动到不转换的第一条记录。它的值为40036798809
,这是11个数字,因此应该与INT(11)
匹配吗?UPDATE
查询按主键id
的升序排列)ip
值为该记录为10317637058914
,其长度为14个数字,不应该可以在INT(11)
字段中使用,是吗?ORDER
在 HeidiSQL 中的ip
表,然后突然显示最高值记录ip
列为1202623438
。这是十个数字。 phpMyAdmin 也显示了更大的数字,但是我已经切换到HeidiSQL,因为我发现它的GUI对于我的本地开发来说是优越的。BIGINT
的数据类型的长度与列范围无关。 HeidiSQL 只需更改ip
即可更改ORDER
列值!
ip
列的无符号意味着ip
列 已签名,因此它的最大值为(全部)逗号添加了仅用于可视化,实际值是纯数字的)2,147,483,647而在UPDATE
查询期间不会解析的值是40,036,798,809。问题
UPDATE
查询不能解析整个表?UPDATE
列类型为ip
,则在BIGINT(11)
查询期间如何处理值40,036,798,809(同样,没有逗号)?ORDER
时显示有效最高值;这是最准确的猜测吗?答案 0 :(得分:1)
您的号码40,036,798,809似乎大于最大可能的ipv4地址255.255.255.255
,后者产生4.294.967.295
(或0xFFFFFFFF
)或最大的无符号longint。因此它不可能是IPV4地址,因此为空,因此是错误。
也许您的某些号码不是IPV4地址?
至于你的MySQL Integer列大小,我觉得它的字节大小有些混乱。您可以在What is the size of column of int(11) in mysql in bytes?上阅读该主题。
答案 1 :(得分:0)
您的转换是正确的;您的数据是错误的。 IPv4涉及32位数字;你有BIGINT
大于32位的东西。
这将找到坏行:
SELECT ip FROM example WHERE ip > INET_ATON('255.255.255.255');
你可能会发现196(1279-1083)个坏行。
(11)
完全未使用且无关紧要(除非您有ZEROFILL
)。