sqlite에서 이진 블로브의 길이 (크기)를 어떻게 찾습니까?
문제
Blob 파일이 포함 된 SQLite 테이블이 있지만 Blob에서 크기/길이 점검을 수행해야합니다. 어떻게해야합니까?
Length ()가 텍스트에서만 작동하고 첫 번째 널 이후의 계수가 중단되기 때문에 길이 (Blob)를 사용하지 않는 일부 문서에 따르면 내가 찾은 일부 문서에 따르면. 내 경험적 테스트는 이것이 사실 인 것으로 나타났습니다.
SQLITE 3.4.2를 사용하고 있습니다
업데이트 :
따라서 SQLITE 3.7.6 기준으로 Length () 함수가 블로브의 올바른 값을 반환하는 것처럼 보입니다. 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 열에 문자열을 저장하면 해당 행의 문자열 열. 길이가 문자열에서 다르게 작동하므로 최종 0 옥셋 이전의 문자 수만 반환합니다. 블로브를 삽입하려면 일반적으로 주조해야하기 때문에 끈을 얼룩 열에 보관하기 쉽습니다.
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
길이 (16 진수 (blob-column))/2가 작동하는 이유는 육각형이 내부 0 옥셋에서 멈추지 않기 때문에 생성 된 16 진수에는 더 이상 0 옥셋이 포함되어 있지 않으므로 길이는 올바른 (전체) 길이를 반환하기 때문입니다.
a의 예 select
이 작업을 수행하는 쿼리 myblob
, 테이블에 mytable
, 3 행 :
select length(myblob) from mytable where rowid=3;
Debian 7의 SQLITE 3.7.13의 길이 () 기능은 작동하지 않지만 길이 (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