/ / Poner números hexadecimales largos en sqlite [cerrado] - perl, sqlite

Poner números hexadecimales largos en sqlite [cerrado] - perl, sqlite

Tengo un feed de enteros largos (80 bits), serializados como cadenas hexadecimales (como 0x100C044D000002180004) que quiero poner en una base de datos sqlite (en una number(38) campo)

Según la documentación de sqlite:

Los literales enteros hexadecimales se interpretan como enteros de complemento a s de dos bits de 64 bits y, por lo tanto, están limitados a dieciséis dígitos significativos de precisión.

Luego, cuando intento insertarlos en sqlite, obtengo un hex literal too big error.

Intenté usar bigint Módulo para convertirlo en un escalar bigint, pero recibo errores extraños:

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.

Las líneas a las que se hace referencia en los errores son tipo de eval { do_something(); 1; }

¿Tiene alguna idea acerca de ellos, o cómo no usar Bigint?

Respuestas

1 para la respuesta № 1

El uso inútil de una constante en un contexto vacío es unamensaje de error de Perl que generalmente significa que está descartando accidentalmente algunos valores en una asignación, a menudo porque no está haciendo coincidir escalar y enumerar contexto para estructuras de datos

p.ej. Si corro este forro

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

esto ocurre porque estoy asignando desde un literal de lista en un contexto escalar.

Esto hace que el intérprete de perl asigne el valor 3 (el elemento final de la lista), al escalar $a. Una vez que el programa se compila en un código de bytes, porque estoy ejecutando advertencias, el compilador se da cuenta de que hay un valor constante no utilizado (2) en la fuente, y se queja de ello.

Algo como esto está causando tu error.mensaje, espero. En cuanto a la causa exacta del problema o cómo solucionar el problema de codificación, realmente no podría decirlo sin ver el código fuente de perl que produce el error.

Sin embargo, sus valores serán forzados (silenciosamente) a punto flotante, ya que el tipo entero máximo que SQLite almacenará es un 64bit firmado.

Entonces, lo que probablemente quiera hacer es usar un campo BLOB, y usar el pack / unpack Perl funciona para codificar sus números grandes en forma binaria en una cadena de bytes. A continuación, puede almacenar esta cadena de bytes como un literal BLOB.

Alternativamente, si solo desea leer los valores utilizando perl, puede usar Storable en conjunción con bigint, y serializar una estructura de datos perl en el campo BLOB, pero esto no será portátil más allá de perl.


2 para la respuesta № 2

Cualquier problema que tengas con Bigint esdiscutible. Incluso en el improbable caso de que el controlador SQLite admita objetos Math :: BigInt, SQLite no puede almacenar números tan grandes de acuerdo con la documentación citada. Tendrás que guardarlos como cuerdas.