Mysql 将数据库列从无符号更改为二进制,而不转换为字符串
我有一个表,在Mysql 将数据库列从无符号更改为二进制,而不转换为字符串,mysql,mariadb,Mysql,Mariadb,我有一个表,在无符号整数列中包含IPv4地址。我现在将其更改为支持IPv6地址,如INET6\u ATON()返回的,它需要VARBINARY(16)列类型 如何更改现有列以保留其内容 ALTER TABLE hitcounts CHANGE ip ip BINARY(16); 上面的命令似乎正在将无符号整数值转换为字符串等效值,这不是我想要的 示范 虽然转换后的ip值似乎已被保留,但它们实际上已被转换为ASCII字符串(请注意,第三行的左对齐方式与实数时使用的右对齐方式相比)。尝试获取IP
无符号整数列中包含IPv4地址。我现在将其更改为支持IPv6地址,如INET6\u ATON()
返回的,它需要VARBINARY(16)
列类型
如何更改现有列以保留其内容
ALTER TABLE hitcounts CHANGE ip ip BINARY(16);
上面的命令似乎正在将无符号整数值转换为字符串等效值,这不是我想要的
示范
虽然转换后的ip值似乎已被保留,但它们实际上已被转换为ASCII字符串(请注意,第三行的左对齐方式与实数时使用的右对齐方式相比)。尝试获取IP地址将失败:
SELECT INET6_NTOA(ip) FROM hitcounts;
+----------------+
| INET6_NTOA(ip) |
+----------------+
| NULL |
| NULL |
| NULL |
+----------------+
3 rows in set (0.01 sec)
简单的解决方案是按照所述修改列,然后更新列以转换为INET6_ATON()生成的二进制字符串:
由于INET6函数处理IPv4的4字节二进制文件和IPv6的16字节二进制文件,我认为这更接近“正确”:
ALTER TABLE hitcounts MODIFY COLUMN ip VARBINARY(16) NOT NULL;
VAR
是因为INET6\u-ATON('1.2.3.4')
生成一个二进制(4)
字符串
我还没有验证,仅仅将无符号
转换为VARBINARY(16)
将正确保留IPv4值
需要MySQL 5.6.3或MariaDB 10.0.12。(在早些时候,我认为MariaDB使用了不同的拼写:INET6_-NTOP()
和INET6_-PTON()
)。尝试的ALTER
之前的数据类型是什么?它是一个无符号整数列hmmm。。。请注意,INET6_-NTOA(INET6_-ATON(INET_-NTOA(1318892803))
-->
78.156.181.3。感谢您的输入VARBINARY
也显示了我遇到的问题。我在我的问题中添加了一些代码来澄清这个问题。我现在不确定字符串转换是否是一种转移注意力的方法,似乎INET6_ATON
为IPv4地址生成的输出与INET_ATON
不同,因此可能没有一种方法可以在不使用INET6_ATON(INET_NTOA())
的情况下转换值,正如您所指出的,在较旧的MySQL/MariaDB服务器上不可用。
UPDATE hitcounts SET ip = INET6_ATON(INET_NTOA(ip));
ALTER TABLE hitcounts MODIFY COLUMN ip VARBINARY(16) NOT NULL;