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)))