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
ドキュメントは、これを反映するように変更されました。
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