如何让 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

然后您可以将其作为原始二进制值导入。