INET6_ATON

时间:2016-01-30 14:34:56

标签: php mysql sql ip ipv6

将旧的INET_ATON值转换为新的二进制INET6_ATON值,而不使用INET6_ATON / INET6_NTOA

我们在表格中有现有数据,该字段属于UNSIGNED INT类型,其中包含使用INET_ATON()创建的IPv4数据。

但是现在我们在查询中转移到INET6_ATON(),并希望在不创建其他数据库字段的情况下进行数据迁移。

所以我将字段类型从UNSIGNED INT更改为VARBINARY(16)

新数据以INET6_ATON()存储为二进制值。

但是我们如何转换旧数据呢? 我已经尝试将现有值转换为整数并将它们转换为HEX。使用INET6_ATON()保存时,这会给我相同的十六进制字符串。

我是否错过了一些步骤或一些文字? 更新访问者SET ip = HEX(CAST(IP AS UNSIGNED))

二进制数据不一样。在这种情况下,它将保存为十六进制值。使用BIN()CONVERT()CAST()没有帮助。

示例数据:

unsigned int字段中的旧ip值:
2130706433(= ip2long(' 127.0.0.1'))

varbinary字段中显示的旧值:
32313330373036343333(= 2130706433)

varbinary字段中显示的新值:
7f000001(= INET6_ATON(' 127.0.0.1'))

我们无法直接使用INET6_ATON() / INET6_NTOA()进行转换。

我们是否应该使用PHP函数inet_top()inet_pton()转换每一行的数据,或者是否有一个纯SQL解决方案,而不需要一些UDF,所以所有行都会立即更新?< / p>

似乎已经有类似的问题,但没有解决方案,评论中提到的解决方案会产生错误的数据,并且没有提供一些工作示例代码:Convert IPv6 to binary without INET6_ATON()

参考文献:
http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet6-aton
http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet6-ntoa
http://php.net/manual/en/function.inet-pton.php
http://php.net/manual/en/function.inet-ntop.php

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。

使用UPDATE查询,我们可以从数据库中获取原始值,再次将其转换为int,hex和unhex it(可以进一步缩短吗?),我们在数据库中获得正确的二进制值。

UPDATE table SET ip = UNHEX(HEX(CAST(ip AS UNSIGNED)))