2008-10-30 28 views
30

Tôi có một bảng sqlite có chứa tệp BLOB, nhưng cần phải kiểm tra kích thước/chiều dài trên blob, làm cách nào để thực hiện điều đó?Làm cách nào để tìm độ dài (kích thước) của một đốm màu nhị phân trong sqlite

Theo một số tài liệu tôi đã tìm, sử dụng độ dài (blob) sẽ không hoạt động, bởi vì length() chỉ hoạt động trên văn bản và sẽ ngừng đếm sau NULL đầu tiên. Các thử nghiệm thực nghiệm của tôi đã cho thấy điều này là đúng.

Tôi đang sử dụng SQLite 3.4.2


Cập nhật:

Vì vậy, khi các SQLite 3.7.6 nó xuất hiện như là mặc dù chiều dài() chức năng trả về giá trị đúng của các đốm màu - Tôi đã kiểm tra các bản ghi thay đổi khác nhau của sqlite, nhưng không thấy trong phiên bản này đã được sửa chữa.

Từ Sqlite 3.7.6:

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

Các documentation được thay đổi để phản ánh điều này.

 
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. 

Trả lời

35

đã không có vấn đề này, nhưng bạn có thể thử length(hex(glob))/2

Cập nhật (Aug-2012): Đối với SQLite 3.7.6 (phát hành ngày 12 tháng tư năm 2011) và sau đó, length(blob_column) công trình như mong đợi cả dữ liệu văn bản và nhị phân.

9

đối với tôi length(blob) hoạt động tốt, mang lại kết quả tương tự như kết quả khác.

+2

Đối với một đốm màu nhị phân?Điều đó sẽ vi phạm tài liệu SQLite cho biết các đốm màu được coi là văn bản và độ dài như vậy() chỉ chính xác cho đến khi nó tìm thấy ký tự '\ 0'. – Petriborg

+0

Tài liệu hiện tại tại http://www.sqlite.org/lang_corefunc.html nói "Hàm length (X) trả về độ dài của X trong ký tự nếu X là một chuỗi, hoặc tính bằng byte nếu X là một đốm màu". – Govert

3

Ví dụ về một truy vấn select mà thực hiện điều này, nhận được chiều dài của blob trong cột myblob, trong bảng mytable, trong hàng 3:

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

LENGTH() chức năng trong SQLite 3.7.13 trên Debian 7 không hoạt động, nhưng LENGTH (HEX())/2 hoạt động tốt.

# 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 
6

Như một câu trả lời bổ sung, một vấn đề phổ biến là sqlite hiệu quả bỏ qua các loại cột của một bảng, vì vậy nếu bạn lưu trữ một chuỗi trong một cột blob, nó trở thành một cột chuỗi cho hàng đó. Khi chiều dài hoạt động khác nhau trên chuỗi, sau đó nó sẽ chỉ trả về số ký tự trước số 0 octet cuối cùng. Thật dễ dàng để lưu trữ các chuỗi trong cột blob vì bạn thường phải đúc một cách rõ ràng để chèn một blob:

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

để có được độ dài chính xác cho các giá trị được lưu trữ như chuỗi, bạn có thể cast đối số chiều dài để blob:

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

Lý do tại sao chiều dài (hex (blob-column))/2 hoạt động là hex không dừng ở 0 octet nội bộ và chuỗi hex được tạo không chứa 0 octet nữa, do đó độ dài trả về đúng (đầy đủ) chiều dài.

Một ký tự, được lưu trữ trong một byte, có thể biểu diễn dưới dạng 2 chuỗi hex.

Các vấn đề liên quan