web-dev-qa-db-ja.com

SQLiteでバイナリBLOBの長さ(サイズ)を見つける方法

BLOBファイルを含むsqliteテーブルがありますが、BLOBのサイズ/長さのチェックを行う必要があります。どうすればよいですか?

私が見つけたいくつかのドキュメントによると、length()はテキストでのみ機能し、最初のNULLの後にカウントを停止するため、length(blob)を使用しても機能しません。私の経験的なテストでは、これが真実であることが示されています。

SQLite 3.4.2を使用しています


アップデート:

したがって、SQLite 3.7.6以降では、length()関数がblobの正しい値を返すように見えます。sqliteのさまざまな変更ログを確認しましたが、これが修正されたバージョンはわかりませんでした。

Sqlite 3.7.6から:

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

documentation はこれを反映するように変更されました。

 length(X)length(X)関数は、Xが
の場合は文字数で、Xがblobの場合はバイト数でXの長さを返します。 XがNULLの場合、length(X)は
 NULLです。 Xが数値の場合、length(X)はX。
の文字列
表現の長さを返します。
40
Petriborg

この問題は発生していませんが、length(hex(glob))/2を試すことができます

pdate(Aug-2012): SQLite 3.7.6(2011年4月12日リリース)以降の場合、length(blob_column)はテキストデータとバイナリデータの両方で期待どおりに機能します。

45
Javier

私にとってはlength(blob)は問題なく動作し、他と同じ結果が得られます。

10
Chris

追加の回答として、一般的な問題はsqliteがテーブルの列タイプを効果的に無視するため、文字列をblob列に格納すると、それはその行の文字列列になります。文字列では長さが異なるため、最後の0オクテットの前の文字数のみが返されます。通常、ブロブを挿入するには明示的にキャストする必要があるため、ブロブ列に文字列を格納するのは簡単です。

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

文字列として保存された値の正しい長さを取得するには、length引数をblobにキャストします。

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

Length(hex(blob-column))/ 2が機能する理由は、16進数が内部の0オクテットで停止せず、生成された16進数文字列に0オクテットが含まれないため、長さが正しい(完全な)長さを返すためです。

7
Remember Monica

これを実行するselectクエリの例では、テーブルmyblobの列mytable、行3のblobの長さを取得します。

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

Debian 7上のsqlite 3.7.13のLENGTH()関数は機能しませんが、LENGTH(HEX())/ 2は正常に機能します。

# 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
2
user3336503