INET6_ATON 的备选 MySQL 代码
alternative MySQL code for INET6_ATON
将旧的 INET_ATON 值转换为新的二进制 INET6_ATON 值而不使用 INET6_ATON / INET6_NTOA
我们在 table 中有现有数据,该字段的类型为 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 所以所有行都被一次更新?
似乎已经有类似的问题,但没有解决方案,评论中提到的解决方案产生了错误的数据,并且没有提供一些有效的示例代码: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
我找到了解决方案。
通过 UPDATE
查询,我们可以从数据库中获取原始值,再次将其转换为 int,十六进制和非十六进制(可以进一步缩短吗?),然后我们在数据库。
UPDATE table SET ip = UNHEX(HEX(CAST(ip AS UNSIGNED)))
将旧的 INET_ATON 值转换为新的二进制 INET6_ATON 值而不使用 INET6_ATON / INET6_NTOA
我们在 table 中有现有数据,该字段的类型为 UNSIGNED INT
,其中包含使用 INET_ATON()
.
但现在我们在查询中移动到 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 所以所有行都被一次更新?
似乎已经有类似的问题,但没有解决方案,评论中提到的解决方案产生了错误的数据,并且没有提供一些有效的示例代码: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
我找到了解决方案。
通过 UPDATE
查询,我们可以从数据库中获取原始值,再次将其转换为 int,十六进制和非十六进制(可以进一步缩短吗?),然后我们在数据库。
UPDATE table SET ip = UNHEX(HEX(CAST(ip AS UNSIGNED)))