Frage

Ich habe eine SQLite-Tabelle, die eine BLOB-Datei enthält, muss aber eine Größe / Länge Überprüfung der Blob tun, wie mache ich das?

Nach einiger Dokumentation Ich fand, mit Länge (blob) wird nicht funktionieren, weil Länge () auf Texte funktioniert nur und Zählen nach dem ersten NULL zu stoppen. Meine empirischen Tests haben gezeigt, dass dies wahr ist.

Ich verwende SQLite 3.4.2


Updates:

So wie die SQLite 3.7.6 es scheint, als ob die Länge () Funktion, um den korrekten Wert von Blobs zurück -. Ich verschiedene Wechseln Protokolle von SQLite überprüft, aber nicht sehen, in welcher Version dieses korrigiert

Von SQLite 3.7.6:

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

Die Dokumentation wurde geändert, dies zu reflektieren.

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.
War es hilfreich?

Lösung

haben dieses Problem nicht gehabt, aber man könnte versuchen length(hex(glob))/2

Update (August 2012): Für SQLite 3.7.6 (veröffentlicht 12. April 2011) und später length(blob_column) arbeitet als beide sowohl Text- als auch binäre Daten erwartet.

Andere Tipps

für mich length(blob) ganz gut funktioniert, gibt die gleichen Ergebnisse wie die andere.

Als weitere Antwort, ein weit verbreitetes Problem ist, dass SQLite effektiv den Spaltentyp einer Tabelle ignoriert, so dass, wenn Sie eine Zeichenfolge in einer BLOB-Spalte zu speichern, wird es eine String-Spalte für diese Zeile . Als Länge unterschiedlich auf Strings arbeitet, wird es dann wieder nur die Anzahl der Zeichen vor den letzten 0 Oktett. Es ist einfach zu speichern Strings in Blob Spalten, weil Sie in der Regel explizit werfen müssen, um einen Klecks einzufügen:

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

die richtige Länge für Werte als String gespeichert zu bekommen, können Sie die Länge Argument blob Stimmen:

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

Der Grund, warum Länge (hex (Blob-Spalte)) / 2 Arbeiten ist, dass hex nicht auf interne 0 Oktetts nicht zu stoppen, und die erzeugte Hex-String enthält keine 0 Bytes mehr, also Länge gibt die richtige (Voll ) Länge.

Beispiel einer select Abfrage, die dies tut, um die Länge des Blobs in Spalte myblob bekommen, in der Tabelle mytable, in Zeile 3:

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

LÄNGE () Funktion in SQLite 3.7.13 auf Debian 7 nicht funktioniert, aber LÄNGE (HEX ()) / 2 funktioniert gut.

# 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top