/ / Помістіть довгі шістнадцяткові числа в sqlite [закритий] - perl, sqlite

Введіть довгі шістнадцяткові номери в sqlite [closed] - perl, sqlite

У мене є подача довгих цілих чисел (80 біт), серіалізованих у вигляді шістнадцяткових рядків (наприклад, 0x100C044D000002180004), яку я хочу розмістити в базі даних sqlite (в number(38) поле)

Відповідно до документації sqlite:

Шістнадцяткові цілі літералі інтерпретуються як 64-бітні цілі числа "s-комплементу" і, таким чином, обмежуються шістнадцятьма значущими цифрами точності.

Потім, коли я намагаюся вставити їх у 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

Марне використання константи в недійсному контексті - цеповідомлення про помилку perl, яке зазвичай означає, що ви "випадково відкидаєте деякі значення в призначенні - часто тому, що ви" невідповідний скалярний і список списку для структур даних

напр. Якщо я запускаю цей один лайнер

$ 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 не може зберігати такі великі числа згідно з цитованою документацією. Вам доведеться зберігати їх як рядки.