質問

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

ドキュメントは、これを反映するように変更されました。

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.
役に立ちましたか?

解決

この問題は発生していませんが、 length(hex(glob))/ 2

を試すことができます

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

他のヒント

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

追加の回答として、一般的な問題は、sqliteがテーブルの列タイプを事実上無視することです。したがって、blob列に文字列を格納すると、その行の string列になります。文字列では長さが異なるため、最後の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が機能する理由は、hexが内部0オクテットで停止せず、生成された16進文字列に0オクテットが含まれないため、lengthは正しい(full )長さ。

これを行う select クエリの例。列 myblob のテーブル mytable の行3にあるblobの長さを取得します:

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

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top