كيف يمكنني العثور على طول (حجم) النقطة الثنائية في sqlite

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

  •  05-07-2019
  •  | 
  •  

سؤال

لدي جدول sqlite يحتوي على ملف BLOB، ولكنني بحاجة إلى التحقق من الحجم/الطول على blob، كيف أفعل ذلك؟

وفقًا لبعض الوثائق التي وجدتها، فإن استخدام length(blob) لن ينجح، لأن length() يعمل فقط على النصوص وسيتوقف عن العد بعد NULL الأول.وقد أظهرت اختباراتي التجريبية أن هذا صحيح.

أنا أستخدم SQLite 3.4.2


التحديثات:

لذلك اعتبارًا من SQLite 3.7.6 يبدو كما لو أن الدالة length() تُرجع القيمة الصحيحة للنقط - لقد قمت بفحص سجلات التغيير المختلفة لـ 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):بالنسبة لـ SQLite 3.7.6 (تم إصداره في 12 أبريل 2011) والإصدارات الأحدث، length(blob_column) يعمل كما هو متوقع لكل من البيانات النصية والثنائية.

نصائح أخرى

وبالنسبة لي length(blob) يعمل على ما يرام، ويعطي نفس النتائج مثل غيرها.

وأما إجابة إضافية، مشكلة مشتركة هي أن سكليتي تتجاهل بشكل فعال نوع عمود من الجدول، لذلك إذا قمت بتخزين سلسلة في عمود سائل، يصبح عمود سلسلة لهذا الصف . كما يعمل طول مختلفة على الجمل، فإنه سيتم ثم العودة فقط عدد الأحرف قبل 0 الثماني الأخيرة. فإنه من السهل أن سلاسل المتاجر في الأعمدة النقطة لأن لديك عادة للادلاء صراحة إلى إدراج النقطة:

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

للحصول على طول الصحيح للقيم المخزنة كسلسلة، يمكنك يلقي الحجة طول إلى النقطة:

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

والسبب في طول (عرافة (فقاعة عمود)) / 2 يعمل هو أن عرافة لا يتوقف عند 0 الثمانية الداخلية، وسلسلة عرافة إنشاؤها لا يحتوي على 0 الثمانية بعد الآن، لذلك طول إرجاع صحيحة (كاملة ) طول.

مثال استعلام select أن يفعل ذلك، والحصول على طول سائل في العمود myblob في الجدول mytable، في الصف 3:

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

وظيفة الطول () في SQLite 3.7.13 على ديبيان 7 لا يعمل، ولكن طول (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