Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将数据库列从无符号更改为二进制,而不转换为字符串_Mysql_Mariadb - Fatal编程技术网

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;