如何让 MySQL 的 "load data" 正确地将非常大的整数导入二进制 (16) 字段?
How do I get MySQL's "load data" to properly import very large integers into a binary(16) field?
我有一个包含以非常大的整数表示的 ipv6 地址的文件。当我将它导入 mysql 时,数据是错误的。我需要做什么才能获取加载数据以将数据正确导入 binary(16) 列?
架构:
CREATE TABLE `ipv6_test` (
`ip` binary(16) NOT NULL,
`name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
要导入的 CSV 文件,ipv6_test.csv:
"58569107296622255421594597096899477505","test"
MySQL导入命令:
mysql> load data local infile 'ipv6_test.csv' into table ipv6_test fields terminated by ',' enclosed by '"' lines terminated by '\n';
查询:
select ip, INET6_NTOA(ip), name from ipv6_test;
不正确的结果:
+------------------+-----------------------------------------+------+
| ip | INET6_NTOA(ip) | name |
+------------------+-----------------------------------------+------+
| 5856910729662225 | 3538:3536:3931:3037:3239:3636:3232:3235 | test |
+------------------+-----------------------------------------+------+
预期结果:
+------------------+-----------------------------------------+------+
| ip | INET6_NTOA(ip) | name |
+------------------+-----------------------------------------+------+
| ? binary data ? | 2C0F:FFF0:0000:0000:0000:0000:0000:0001 | test |
+------------------+-----------------------------------------+------+
INET6_NTOA()
获取原始二进制地址并将其转换为十六进制版本。您传递的是一个无效的整数。
"58569107296622255421594597096899477505"
变成 0x353835363931303732393636...
作为原始十六进制,这就是那个奇怪的值的来源。
我不确定 MySQL 是否可以操纵 128 位数字 和 也可以解释突然出现的字节序问题。除了 NUMERIC
类型之外,它可以在内部处理的最大值似乎是 64 位。您需要在写入 CSV 之前转换您的数据。
例如,如果您可以将其转换为文件中的如下所示:
0x2c0ffff0000000000000000000000001,test
然后您可以将其作为原始二进制值导入。
我有一个包含以非常大的整数表示的 ipv6 地址的文件。当我将它导入 mysql 时,数据是错误的。我需要做什么才能获取加载数据以将数据正确导入 binary(16) 列?
架构:
CREATE TABLE `ipv6_test` (
`ip` binary(16) NOT NULL,
`name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
要导入的 CSV 文件,ipv6_test.csv:
"58569107296622255421594597096899477505","test"
MySQL导入命令:
mysql> load data local infile 'ipv6_test.csv' into table ipv6_test fields terminated by ',' enclosed by '"' lines terminated by '\n';
查询:
select ip, INET6_NTOA(ip), name from ipv6_test;
不正确的结果:
+------------------+-----------------------------------------+------+
| ip | INET6_NTOA(ip) | name |
+------------------+-----------------------------------------+------+
| 5856910729662225 | 3538:3536:3931:3037:3239:3636:3232:3235 | test |
+------------------+-----------------------------------------+------+
预期结果:
+------------------+-----------------------------------------+------+
| ip | INET6_NTOA(ip) | name |
+------------------+-----------------------------------------+------+
| ? binary data ? | 2C0F:FFF0:0000:0000:0000:0000:0000:0001 | test |
+------------------+-----------------------------------------+------+
INET6_NTOA()
获取原始二进制地址并将其转换为十六进制版本。您传递的是一个无效的整数。
"58569107296622255421594597096899477505"
变成 0x353835363931303732393636...
作为原始十六进制,这就是那个奇怪的值的来源。
我不确定 MySQL 是否可以操纵 128 位数字 和 也可以解释突然出现的字节序问题。除了 NUMERIC
类型之外,它可以在内部处理的最大值似乎是 64 位。您需要在写入 CSV 之前转换您的数据。
例如,如果您可以将其转换为文件中的如下所示:
0x2c0ffff0000000000000000000000001,test
然后您可以将其作为原始二进制值导入。