Come posso trovare la lunghezza (dimensione) di un BLOB binario in sqlite
Domanda
Ho una tabella sqlite che contiene un file BLOB, ma devo fare un controllo di dimensione / lunghezza sul BLOB, come posso farlo?
Secondo alcuni documenti che ho trovato, l'uso di length (blob) non funzionerà, perché length () funziona solo sui testi e smette di contare dopo il primo NULL. I miei test empirici hanno dimostrato che questo è vero.
Sto usando SQLite 3.4.2
Aggiornamenti:
Quindi a partire da SQLite 3.7.6 sembra che la funzione length () restituisca il valore corretto dei BLOB - ho controllato vari log delle modifiche di sqlite, ma non ho visto in quale versione è stato corretto.
Da Sqlite 3.7.6:
payload_id|length(payload)|length(hex(payload))/2 1807913|194|194 1807914|171|171
La documentazione è stata modificata per riflettere questo.
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.
Soluzione
non hanno riscontrato questo problema, ma puoi provare length(hex(glob))/2
Aggiornamento (agosto 2012):
Per SQLite 3.7.6 (rilasciato il 12 aprile 2011) e versioni successive, length (blob_column)
funziona come previsto sia per i dati di testo che binari.
Altri suggerimenti
per me length (blob)
funziona bene, dà gli stessi risultati dell'altro.
Come risposta aggiuntiva, un problema comune è che sqlite ignora efficacemente il tipo di colonna di una tabella, quindi se si memorizza una stringa in una colonna BLOB, diventa una colonna stringa per quella riga . Poiché la lunghezza funziona in modo diverso sulle stringhe, restituirà solo il numero di caratteri prima dell'ottetto 0 finale. È facile archiviare le stringhe nelle colonne BLOB perché normalmente è necessario eseguire il cast esplicito per inserire un BLOB:
insert into table values ('xxxx'); // string insert
insert into table values(cast('xxxx' as blob)); // blob insert
per ottenere la lunghezza corretta per i valori memorizzati come stringa, è possibile eseguire il cast dell'argomento length su BLOB:
select length(string-value-from-blob-column); // treast blob column as string
select length(cast(blob-column as blob)); // correctly returns blob length
Il motivo per cui length (hex (blob-column)) / 2 funziona è che hex non si ferma a 0 ottetti interni e la stringa esadecimale generata non contiene più 0 ottetti, quindi length restituisce il valore corretto (pieno ) lunghezza.
Esempio di una query select
che esegue questa operazione, ottenendo la lunghezza del BLOB nella colonna myblob
, nella tabella mytable
, nella riga 3 :
select length(myblob) from mytable where rowid=3;
La funzione LENGTH () in sqlite 3.7.13 su Debian 7 non funziona, ma LENGTH (HEX ()) / 2 funziona bene.
# 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