/ / Umieść długie liczby szesnastkowe w sqlite [zamknięte] - perl, sqlite

Umieść długie liczby szesnastkowe w sqlite [closed] - perl, sqlite

Mam kanał długich liczb całkowitych (80 bitów), serializowany jako ciągi szesnastkowe (jak 0x100C044D000002180004), które chcę umieścić w bazie danych sqlite (w a number(38) pole)

Zgodnie z dokumentacją sqlite:

Szesnastkowe literały całkowite są interpretowane jako 64-bitowe dwie liczby całkowite dopełnienia i dlatego są ograniczone do szesnastu znaczących cyfr precyzji.

Potem, gdy próbuję wstawić je do sqlite, otrzymuję hex literal too big błąd.

Próbowałem użyć bigint moduł do konwersji na skalar biginta, ale dostaję dziwne błędy:

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.

Linie, do których odnoszą się błędy, są swego rodzaju eval { do_something(); 1; }

Czy masz jakiś pomysł na ich temat lub jak nie używać biginta?

Odpowiedzi:

1 dla odpowiedzi № 1

Bezużyteczne użycie stałej w pustym kontekście tokomunikat o błędzie perla, który zazwyczaj oznacza, że ​​„przypadkowo odrzucasz niektóre wartości w przypisaniu - często dlatego, że nie pasujesz do kontekstu skalarnego i kontekstowego dla struktur danych

na przykład Jeśli uruchomię ten jeden liner

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

dzieje się tak, ponieważ przypisuję z literału listy w kontekście skalarnym.

Powoduje to, że interpreter perla przypisuje wartość 3 (ostatni element listy), do skalara $a. Po skompilowaniu programu do kodu bajtowego, ponieważ działam z ostrzeżeniami, kompilator zauważa, że ​​istnieje nieużywana stała wartość (2) w źródle i narzeka na to.

Coś takiego powoduje twój błądspodziewam się wiadomości. Jeśli chodzi o dokładną przyczynę problemu lub sposób rozwiązania problemu z kodowaniem, nie mogłem naprawdę powiedzieć, nie widząc kodu źródłowego perla, który powoduje błąd.

Twoje wartości będą (po cichu) wymuszone na zmiennoprzecinkowym, ponieważ maksymalny typ całkowity, który SQLite będzie przechowywać, to podpisany 64-bitowy.

Tak więc prawdopodobnie chcesz użyć pola BLOB i użyć pack / unpack funkcje perla do kodowania dużych liczb w postaci binarnej w łańcuch bajtów. Następnie możesz zapisać ten ciąg bajtów jako literał BLOB.

Alternatywnie, jeśli chcesz tylko odczytać wartości za pomocą perla, możesz użyć Storable w połączeniu z biginti szereguj strukturę danych perla do pola BLOB, ale nie będzie to przenośne poza perlem.


2 dla odpowiedzi nr 2

Jakikolwiek problem masz z bigintemsporny. Nawet w mało prawdopodobnym przypadku, gdy sterownik SQLite obsługuje obiekty Math :: BigInt, SQLite nie może przechowywać dużych liczb zgodnie z cytowaną dokumentacją. Będziesz musiał przechowywać je jako łańcuchy.