/ / Поставете дълги шестнадесетични числа в sqlite [затворен] - perl, sqlite

Сложете дълги шестнадесетични числа в sqlite [closed] - perl, sqlite

Имам емисия на дълги цели числа (80-бита), сериализирани като шестнадесетични низове (като 0x100C044D000002180004), които искам да поставя в базата данни sqlite (в a number(38) поле)

Според документацията на sqlite:

Шестнадесетичните целочислени литерали се интерпретират като 64-битови две "s-complement integers и следователно са ограничени до шестнадесет значими цифри на точност.

Тогава, когато се опитвам да ги вмъкна в 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?

Отговори:

1 за отговор № 1

Безполезна употреба на константа в празен контекст е aperl съобщение за грешка, което обикновено означава, че случайно отхвърляте някои стойности в дадено задание - често защото несъответствате на скаларния и списъкния контекст за структурите от данни

например Ако тичам този лайнер

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

това се случва, защото аз "" присвоявам от списък буквално в скаларен контекст.

Това кара интерпретатора на perl да присвои стойността 3 (последният елемент от списъка), към скалара $a, След като програмата е компилирана в байт код, защото аз съм с предупреждения, компилаторът забелязва, че има неизползвана постоянна стойност2) в източника и се оплаква от него.

Нещо като това причинява грешката висъобщение, очаквам. Що се отнася до точната причина за проблема, или как да поправите проблема си с кодирането, не можех да кажа, без да виждам изходния код на perl, който произвежда грешката.

Вашите стойности ще бъдат (тихо) принудени към плаваща запетая, тъй като максималният цялостен тип SQLite ще се съхранява под 64-битов.

Така че това, което вероятно искате да направите, е да използвате поле BLOB и да използвате pack / unpack perl функции за кодиране на вашите големи числа в двоична форма в байт низ. След това можете да съхраните този байтов низ като BLOB литерал.

Като алтернатива, ако някога искате да прочетете стойностите с помощта на perl, можете да използвате Storable във връзка с bigintи сериализира perl структура на данни в BLOB полето, но това няма да бъде преносимо извън perl.


2 за отговор № 2

Какъвто и проблем да имате с бининтспорен. Дори в малко вероятния случай, че драйверът на SQLite поддържа Math :: BigInt обекти, SQLite не може да съхранява толкова големи номера според документацията, която цитира. Ще трябва да ги съхраните като низове.