将旧的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
答案 0 :(得分:2)
我找到了解决方案。
使用UPDATE
查询,我们可以从数据库中获取原始值,再次将其转换为int,hex和unhex it(可以进一步缩短吗?),我们在数据库中获得正确的二进制值。
UPDATE table SET ip = UNHEX(HEX(CAST(ip AS UNSIGNED)))