Question

J'ai une table sqlite contenant un fichier BLOB, mais je dois vérifier la taille et la longueur du blob. Comment procéder?

Selon certains documents que j'ai trouvés, l'utilisation de length (blob) ne fonctionnerait pas, car length () ne fonctionne que sur les textes et cesse de compter à compter du premier NULL. Mes tests empiriques ont montré que cela était vrai.

J'utilise SQLite 3.4.2

Mises à jour:

Ainsi, à partir de SQLite 3.7.6, il semble que la fonction length () renvoie la valeur correcte de blobs. J'ai vérifié divers journaux de modifications de sqlite, mais je ne voyais pas dans quelle version cela avait été corrigé.

De SQLite 3.7.6:

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

La documentation a été modifiée en conséquence.

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.
Était-ce utile?

La solution

n'a pas eu ce problème, mais vous pouvez essayer length (hex (glob)) / 2

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

Autres conseils

pour moi longueur (blob) fonctionne très bien, donne les mêmes résultats que les autres.

Comme réponse supplémentaire, un problème courant est que sqlite ignore effectivement le type de colonne d’une table. Par conséquent, si vous stockez une chaîne dans une colonne blob, elle devient une colonne pour cette ligne . Comme la longueur est différente sur les chaînes, il ne renvoie que le nombre de caractères avant le 0 octet final. Il est facile de stocker des chaînes dans des colonnes d'objets blob, car vous devez normalement explicitement convertir pour insérer un objet 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 convertir l'argument de longueur en objet 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 length (hex (blob-column)) / 2 fonctionne est que l'hex ne s'arrête pas à 0 octet interne, et que la chaîne hexagonale générée ne contient plus 0 octet. La longueur est donc retournée. ) longueur.

Exemple d'une requête select effectuant cette opération, obtenant la longueur du blob dans la colonne myblob , dans la table mytable , ligne 3 :

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

La fonction LENGTH () de sqlite 3.7.13 sous Debian 7 ne fonctionne pas, mais LENGTH (HEX ()) / 2 fonctionne correctement.

# 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top