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.
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top