在sqlite中放入长十六进制数

时间:2014-12-15 17:47:59

标签: perl sqlite

我有一个长整数(80位)的序列,序列化为十六进制字符串(如0x100C044D000002180004),我想放入一个sqlite数据库(在number(38)字段中)

根据sqlite的文档:

  

十六进制整数文字被解释为64位二进制补码整数,因此限制为精度的十六位有效数字。

然后当我尝试在sqlite中插入它们时,我收到hex literal too big错误。

我尝试使用bigint模块将其转换为bigint标量,但我得到了奇怪的错误:

Useless use of a constant (1) in void context at ./applysrv.pl line 119.
Useless use of a constant (1) in void context at ./applysrv.pl line 124.
Useless use of a constant (1) in void context at ./applysrv.pl line 130.
Useless use of a constant (1) in void context at ./applysrv.pl line 469.
Useless use of a constant (1) in void context at ./applysrv.pl line 506.

错误中引用的行有点eval { do_something(); 1; }

您对它们有所了解,或者如何不使用bigint?

2 个答案:

答案 0 :(得分:2)

你遇到bigint的问题是没有意义的。即使在SQLite驱动程序支持Math :: BigInt对象的情况下,SQLite也无法根据您引用的文档存储大的数字。您必须将它们存储为字符串。

答案 1 :(得分:1)

在void上下文中无用的常量是perl错误消息,通常意味着您意外地丢弃了赋值中的某些值 - 通常是因为您对数据结构的标量和列表上下文不匹配< / p>

e.g。如果我运行这个班轮

$ perl -we 'my $a = (1,2,3)'
Useless use of a constant (2) in void context

这是因为我在标量上下文中从列表文字中分配。

这会使perl解释器将值 3 (列表的最后一个元素)赋给标量$a。在将程序编译为字节代码之后,因为我在运行警告时,编译器注意到源中存在未使用的常量值( 2 ),并抱怨它。 / p>

我希望这样的事情会导致您的错误消息。至于问题的确切原因,或者如何修复编码问题,我无法在没有看到产生错误的perl源代码的情况下说出来。

您的值将(默默地)强制转换为浮点数,因为SQLite将存储的最大整数类型是64位签名。

所以你可能想要做的是使用BLOB字段,并使用pack / unpack perl函数将二进制形式的大数字编码为字节字符串。然后,您可以将此字节字符串存储为BLOB文字。

或者,如果您只想使用perl读取值,可以将Storablebigint结合使用,并将perl数据结构序列化到BLOB字段中,但这不会可以移植到perl之外。