Como faço para encontrar o comprimento (tamanho) de um sistema binário em sqlite

StackOverflow https://stackoverflow.com/questions/250940

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma tabela sqlite que contém um arquivo BLOB, mas necessidade de fazer uma verificação de tamanho / comprimento sobre o blob, como posso fazer isso?

De acordo com alguns documentos que eu achei, usando comprimento (blob) não vai funcionar, porque length () só funciona em textos e vai parar a contagem após a primeira NULL. Meus testes empíricos têm mostrado que isso é verdade.

Eu estou usando SQLite 3.4.2


Atualizações:

Assim, a partir de SQLite 3.7.6 parece que a função length () retorna o valor correto de blobs -. Eu verifiquei várias mudanças-logs do SQLite, mas não ver em que esta versão foi corrigido

De Sqlite 3.7.6:

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

O documentação foi alterado para reflectir esta situação.

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.
Foi útil?

Solução

não tive este problema, mas você pode tentar length(hex(glob))/2

Update (Aug-2012): Para SQLite 3.7.6 (lançado 12 de abril de 2011) e, mais tarde, length(blob_column) funciona como esperado tanto tanto dados binários texto e.

Outras dicas

para mim length(blob) funciona muito bem, dá os mesmos resultados como os outros.

Como uma resposta adicional, um problema comum é que sqlite efetivamente ignora o tipo de coluna de uma tabela, por isso, se você armazenar uma string em uma coluna blob, torna-se um coluna de cadeia para essa linha . Como comprimento funciona diferente nas cordas, ele irá retornar apenas o número de caracteres antes do 0 octeto final. É fácil de armazenar cadeias de caracteres em colunas blob porque normalmente você tem que converter explicitamente para inserir um blob:

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

para obter o comprimento correto para valores armazenados como string, você pode lançar o argumento de comprimento para blob:

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

A razão pela qual comprimento (hex (blob-coluna)) / 2 obras é que hex não pára em 0 octetos internos, ea cadeia hex gerado não contém 0 octetos mais, então comprimento retorna o correto (completo ) comprimento.

Exemplo de uma consulta select que faz isso, ficando o comprimento da mancha em myblob coluna, em mytable tabela, na fileira 3:

select length(myblob) from mytable where rowid=3;
função

COMPRIMENTO () no SQLite 3.7.13 no Debian 7 não trabalho, mas COMPRIMENTO (HEX ()) / 2 funciona bem.

# 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top