2008-10-30 12 views
30

में बाइनरी ब्लॉब की लंबाई (आकार) कैसे मिलती है मेरे पास एक एसक्लाइट तालिका है जिसमें एक बीएलओबी फ़ाइल है, लेकिन ब्लॉब पर आकार/लंबाई जांच करने की आवश्यकता है, मैं यह कैसे कर सकता हूं?मुझे एसक्लाइट

कुछ दस्तावेज के अनुसार मुझे लगता है कि लंबाई (ब्लॉब) का उपयोग नहीं किया जाएगा, क्योंकि लंबाई() केवल ग्रंथों पर काम करती है और पहले नल के बाद गिनती बंद कर देगी। मेरे अनुभवजन्य परीक्षणों ने यह सच साबित किया है।

मैं उपयोग कर रहा हूँ SQLite 3.4.2


अपडेट:

तो SQLite के रूप में यह प्रतीत होता है के रूप में यद्यपि लंबाई() फ़ंक्शन धब्बे का सही मान देता है 3.7.6 - मैं जाँच स्क्लाइट के विभिन्न परिवर्तन-लॉग, लेकिन यह नहीं देखा कि यह किस संस्करण में सुधार किया गया था।

SQLite 3.7.6 से:

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

documentation यह दिखाने के लिए बदल गया था।

 
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. 

उत्तर

35

इस समस्या नहीं पड़ा है, लेकिन आप की कोशिश कर सकते length(hex(glob))/2

अद्यतन (अगस्त 2012): SQLite 3.7.6 और उसके बाद length(blob_column) काम करता है (12 अप्रैल, 2011 को जारी) जैसा कि दोनों पाठ और बाइनरी डेटा की उम्मीद है।

9

मेरे लिए length(blob) ठीक काम करता है, वही परिणाम दूसरे जैसा देता है।

+2

बाइनरी ब्लॉब के लिए?यह SQLite दस्तावेज़ीकरण का उल्लंघन करेगा जो कहता है कि ब्लब्स को टेक्स्ट के रूप में माना जाता है और इस तरह की लंबाई() केवल तभी सटीक होती है जब तक कि यह '\ 0' वर्ण नहीं पाती। – Petriborg

+0

http://www.sqlite.org/lang_corefunc.html पर वर्तमान दस्तावेज कहता है कि "एक्स (स्ट्रिंग) एक्स एक्स अक्षरों में एक्स की लंबाई देता है यदि एक्स स्ट्रिंग है, या बाइट्स में एक्स एक्स ब्लॉब है।" – Govert

3

एक select क्वेरी है कि इस करता है, स्तंभ myblob में ब्लॉब की लंबाई रही, टेबल mytable में, पंक्ति 3 में का उदाहरण:

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

लंबाई() डेबियन 7 पर SQLite 3.7.13 में समारोह काम नहीं करता है, लेकिन LENGTH (हेक्स())/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 
6

एक अतिरिक्त जवाब के रूप में, एक आम समस्या है कि SQLite प्रभावी रूप से एक तालिका के स्तंभ प्रकार पर ध्यान नहीं देता है, इसलिए यदि आप एक ब्लॉब स्तंभ में एक स्ट्रिंग की दुकान है, यह उस पंक्ति के लिए एक स्ट्रिंग स्तंभ बन जाता है। चूंकि तार तारों पर अलग-अलग काम करता है, फिर यह अंतिम 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 ऑक्टेट्स नहीं होते हैं, इसलिए लंबाई सही होती है (पूरी लम्बाई।

एक वर्ण, एक बाइट में संग्रहीत एक वर्ण, 2 हेक्स स्ट्रिंग के रूप में प्रतिनिधित्व कर सकता है।

संबंधित मुद्दे