54

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

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

私はSQLite 3.4.2を使用しています


アップデート:

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

Sqlite 3.7.6 から:

ペイロード_id|長さ(ペイロード)|長さ(16進(ペイロード))/2
1807913|194|194
1807914|171|171

これを反映するためにドキュメントが変更されました。

length(X) length(X) 関数は、X が次の場合に X の長さを文字数で返します。
            文字列、または X が blob の場合はバイト単位。X が NULL の場合、length(X) は
            ヌル。X が数値の場合、length(X) は文字列の長さを返します
            Xの表現。
4

5 に答える 5

58

この問題はありませんでしたが、試すことができますlength(hex(glob))/2

更新 (2012 年 8 月): SQLite 3.7.6 (2011 年 4 月 12 日リリース) 以降ではlength(blob_column)、テキスト データとバイナリ データの両方で期待どおりに動作します。

于 2008-10-30T17:57:09.010 に答える
11

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

于 2010-09-23T15:56:14.513 に答える
9

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

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

文字列として格納された値の正しい長さを取得するには、長さ引数を 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 オクテットが含まれなくなったため、長さは正しい (完全な) 長さを返すためです。

于 2015-08-08T16:45:01.140 に答える
4

これを行うクエリの例で、列、テーブル、行 3selectのブロブの長さを取得します。myblobmytable

select length(myblob) from mytable where rowid=3;
于 2013-05-09T19:18:45.937 に答える
2

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
于 2014-02-21T09:22:27.823 に答える