2008-10-30 29 views
30

Tengo una tabla sqlite que contiene un archivo BLOB, pero necesito hacer una verificación de tamaño/longitud en el blob, ¿cómo puedo hacer eso?¿Cómo puedo encontrar la longitud (tamaño) de un blob binario en sqlite?

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

estoy usando SQLite 3.4.2


actualizaciones:

Así como de SQLite 3.7.6 parece como si la función de longitud() devuelve el valor correcto de gotas - Revisé varios registros de cambios de sqlite, pero no vi en qué versión se corrigió esto.

De SQLite 3.7.6:

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

El documentation fue cambiado 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. 

Respuesta

35

no han tenido este problema, pero se podría tratar length(hex(glob))/2

Update (Ago-2012): para SQLite 3.7.6 (publicó el 12 de abril de 2011) y posteriores, length(blob_column) obras como se esperaba, tanto el texto como los datos binarios.

9

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

+2

¿Para un blob binario?Eso sería una violación de la documentación de SQLite que dice que los blobs se tratan como texto y, como tal, length() solo es correcto hasta que encuentra un carácter '\ 0'. – Petriborg

+0

La documentación actual en http://www.sqlite.org/lang_corefunc.html dice "La función de longitud (X) devuelve la longitud de X en caracteres si X es una cadena, o en bytes si X es una burbuja". – Govert

3

Ejemplo de una consulta select que hace esto, conseguir la longitud de la gota en la columna de myblob, en la tabla mytable, en la fila 3:

select length(myblob) from mytable where rowid=3; 
2

LONGITUD() en sqlite 3.7.13 en Debian 7 no funciona, pero LONGITUD (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 
6

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

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

para obtener la longitud correcta de los valores almacenados como cadena, puede emitir el argumento de longitud a gota:

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 0 octetos internos, y la cadena hexadecimal generada ya no contiene 0 octetos, por lo que la longitud devuelve el correcto (longitud total.

Un carácter, almacenado en un byte, puede representar como 2 cadena hexadecimal.

Cuestiones relacionadas