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。 の文字列 表現の長さを返します。
この問題は発生していませんが、length(hex(glob))/2
を試すことができます
pdate(Aug-2012): SQLite 3.7.6(2011年4月12日リリース)以降の場合、length(blob_column)
はテキストデータとバイナリデータの両方で期待どおりに機能します。
私にとってはlength(blob)
は問題なく動作し、他と同じ結果が得られます。
追加の回答として、一般的な問題は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オクテットが含まれないため、長さが正しい(完全な)長さを返すためです。
これを実行する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