문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top