limitations - sqlite3 doc
¿Cómo puedo encontrar la longitud(tamaño) de un blob binario en sqlite? (5)
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?
De acuerdo con cierta documentación que encontré, usar length (blob) no funcionará, porque length () solo funciona en textos y dejará de contar después del primer NULL. Mis pruebas empíricas han demostrado que esto es cierto.
Estoy usando SQLite 3.4.2
Actualizaciones:
Entonces a partir de SQLite 3.7.6 parece como si la función length () devolviera el valor correcto de blobs: 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
La documentation fue cambiada 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.
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 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 octeto final de 0. Es fácil almacenar cadenas en columnas de blob porque normalmente tiene que lanzar 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 0 octetos internos, y la cadena hexadecimal generada ya no contiene 0 octetos, por lo que la longitud devuelve la longitud correcta (completa).
Ejemplo de una consulta de 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
para mí, la length(blob)
funciona muy bien, da los mismos resultados que el otro.
no he tenido este problema, pero puedes probar la length(hex(glob))/2
Actualización (agosto de 2012): para SQLite 3.7.6 (publicado el 12 de abril de 2011) y posterior, length(blob_column)
funciona como se esperaba, tanto en texto como en datos binarios.