Pregunta

Tengo una tabla sqlite que contiene un archivo BLOB, pero necesito hacer una verificación de tamaño / longitud en el blob, ¿cómo hago eso?

De acuerdo con la documentación que encontré, el uso de length (blob) no funcionará, porque length () solo funciona en textos y dejará de contar después del primer valor nulo. Mis pruebas empíricas han demostrado que esto es cierto.

Estoy usando SQLite 3.4.2


Actualizaciones:

Así que a partir de SQLite 3.7.6 parece que la función length () devuelve el valor correcto de blobs. Revisé varios logs de cambio de sqlite, pero no vi en qué versión se corrigió.

Desde Sqlite 3.7.6:

payload_id|length(payload)|length(hex(payload))/2
1807913|194|194
1807914|171|171

La documentación se cambió para reflejar esto.

length(X)   The length(X) function returns the length of X in characters if X is
            a string, or in bytes if X is a blob. If X is NULL then length(X) is
            NULL. If X is numeric then length(X) returns the length of a string 
            representation of X.
¿Fue útil?

Solución

no he tenido este problema, pero puedes probar length(hex(glob))/2

Actualización (agosto de 2012): Para SQLite 3.7.6 (publicado el 12 de abril de 2011) y versiones posteriores, length (blob_column) funciona como se espera tanto en el texto como en los datos binarios.

Otros consejos

para mí length (blob) funciona bien, da los mismos resultados que el otro.

Como respuesta adicional, un problema común es que sqlite ignora efectivamente el tipo de columna de una tabla, por lo que si almacena una cadena en una columna de blob, se convierte en una columna de cadena para esa fila . Como la longitud funciona de forma diferente en las cadenas, solo devolverá el número de caracteres antes del 0 octeto final. Es fácil almacenar cadenas en columnas de blob, ya que normalmente tiene que emitir explícitamente para insertar un blob:

insert into table values ('xxxx'); // string insert
insert into table values(cast('xxxx' as blob)); // blob insert

para obtener la longitud correcta para los valores almacenados como cadena, puede convertir el argumento de longitud en blob:

select length(string-value-from-blob-column); // treast blob column as string
select length(cast(blob-column as blob)); // correctly returns blob length

La razón por la que la longitud (hex (blob-column)) / 2 funciona es que el hex no se detiene en los 0 octetos internos, y la cadena hexadecimal generada ya no contiene 0 octetos, por lo que la longitud devuelve la correcta (completa) ) longitud.

Ejemplo de una consulta select que hace esto, obteniendo la longitud del blob en la columna myblob , en la tabla mytable , en la fila 3 :

select length(myblob) from mytable where rowid=3;
La función

LENGTH () en sqlite 3.7.13 en Debian 7 no funciona, pero LENGTH (HEX ()) / 2 funciona bien.

# sqlite --version
3.7.13 2012-06-11 02:05:22 f5b5a13f7394dc143aa136f1d4faba6839eaa6dc

# sqlite xxx.db "SELECT docid, LENGTH(doccontent), LENGTH(HEX(doccontent))/2 AS b FROM cr_doc LIMIT 10;"
1|6|77824
2|5|176251
3|5|176251
4|6|39936
5|6|43520
6|494|101447
7|6|41472
8|6|61440
9|6|41984
10|6|41472
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top