我有一个长整数(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?
答案 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读取值,可以将Storable
与bigint
结合使用,并将perl数据结构序列化到BLOB字段中,但这不会可以移植到perl之外。