web-dev-qa-db-fra.com

Comment trouver la longueur d'un blob binaire en sqlite

J'ai une table SQLITE contenant un fichier BLOB, mais j'ai besoin de faire une vérification de taille/longueur sur le blob, comment puis-je faire cela?

Selon une documentation que j'ai trouvée, l'utilisation de la longueur (blob) ne fonctionnera pas, car la longueur () ne fonctionne que sur des textes et cessera de compter après la première null. Mes tests empiriques ont montré que cela serait vrai.

J'utilise SQLite 3.4.2


Mises à jour:

Ainsi, comme de SQLite 3.7.6, il apparaît comme si la fonction de longueur () renvoie la valeur correcte des blobs - j'ai vérifié diverses journaux de changement de SQLite, mais n'a pas vu dans quelle version cela a été corrigé.

De SQLite 3.7.6:

 PayLoad_ID | Longueur (charge utile) | Longueur (hexagonale (charge utile))/2 [.____] 1807913 | 194 | 194 [

La Documentation a été modifiée pour refléter ceci.

 Longueur (x) La fonction de longueur (x) renvoie la longueur de x en caractères si x est [.____] une chaîne ou en octets si x est une blob. Si X est null, la longueur (x) est 
 Null. Si X est numérique, la longueur (x) renvoie la longueur d'une chaîne 
 Représentation de x. [.____]
40
Petriborg

je n'ai pas eu ce problème, mais vous pourriez essayer length(hex(glob))/2

Mise à jour (août 2012) : Pour SQLite 3.7.6 (publié 12 avril 2011) et ultérieurement, length(blob_column) fonctionne comme prévu à la fois des données texte et binaires.

45
Javier

pour moi length(blob) fonctionne simplement bien, donne les mêmes résultats comme l'autre.

10
Chris

En réponse à une réponse supplémentaire, un problème courant est que SQLite ignore efficacement le type de colonne d'une table, donc si vous stockez une chaîne dans une colonne blob, elle devient une colonne de chaîne pour cette ligne. À mesure que la longueur fonctionne différente sur les chaînes, elle ne ramènera alors que le nombre de caractères avant le dernier octet 0. Il est facile de stocker des chaînes dans des colonnes blob car vous devez normalement lancer explicitement pour insérer une blob:

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

pour obtenir la longueur correcte des valeurs stockées sous forme de chaîne, vous pouvez lancer l'argument de longueur à Blob:

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

La raison pour laquelle la longueur (HEX (colonne blob))/2 fonctionne est que HEX ne s'arrête pas à 0 octets internes et la chaîne hexagonale générée ne contient plus 0 octets, donc la longueur renvoie la longueur correcte (pleine).

7
Remember Monica

Exemple d'une requête select qui fait cela, obtenant la longueur du blob de la colonne myblob, dans le tableau mytable, dans la rangée 3:

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

Fonction LONGUEUR () dans SQLite 3.7.13 sur Debian 7 ne fonctionne pas, mais la longueur (HEX ())/2 fonctionne très bien.

# 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
2
user3336503