2010-04-06 14 views
10

मूल समस्या: यूनिक्स टाइमस्टैम्प के लिए सही कॉलम प्रारूप क्या है?एसक्यूलाइट: यूनिक्स टाइमस्टैम्प के लिए कॉलम प्रारूप; इंटीजर प्रकार

नेट भ्रम से भरा है: कुछ पदों का दावा है कि SQLite के पास कोई हस्ताक्षरित प्रकार नहीं है - या तो जो भी हो, या 64 बिट इंट प्रकार के अपवाद के साथ (लेकिन वहां (काउंटर-) उदाहरण हैं जो अनसुलझा इंटेग्रर का आह्वान करते हैं)। डेटा प्रकार पृष्ठ केवल एक बड़े उदाहरण में इसका उल्लेख करता है। यह भी दावा करता है कि 6-बाइट पूर्णांक है लेकिन इसके लिए कोई नाम नहीं है। ऐसा लगता है कि INTEGER 4-बाइट हस्ताक्षरित हस्ताक्षरित स्टोर यूनिक्स टाइमस्टैम्प के रूप में नकारात्मक संख्या के रूप में मेरा प्रयास करता है। मैंने सुना है कि कुछ सिस्टम 64-बिट टाइमस्टैम्प भी लौटते हैं। ओटीओएच मैं 1 अतिरिक्त बिट (टाइमस्टैम्प का शीर्ष बिट) स्टोर करने के लिए 4 बाइट्स बर्बाद करने का बहुत शौक नहीं हूं, और यहां तक ​​कि अगर मुझे एक बड़ा डेटा प्रारूप चुनना है, तो मैं 6-बाइट एक के लिए जाना चाहूंगा। मैंने एक पोस्ट भी देखा है जो SQLite यूनिक्स टाइमस्टैम्प का प्रकार है REAL ...

पूर्ण समस्या: क्या कोई उस गड़बड़ी को स्पष्ट कर सकता है?

उत्तर

12

एक पूर्णांक के आकार

SQLite डेटाबेस के सभी स्तंभों को आंतरिक रूप से परिवर्तनीय चौड़ाई कर रहे हैं। file format संख्या 2, 2, 3, 4, 6, या 8 बाइट्स में पूर्णांक स्टोर करता है, इस पर निर्भर करता है कि संख्या कितनी बड़ी है, साथ ही आकार को इंगित करने के लिए शीर्षलेख में एक बाइट। तो, कुल मिलाकर, पूर्णांक के रूप में संग्रहीत यूनिक्स तिथियां 2038-01-19 और उसके बाद 7 बाइट तक 5 बाइट्स ले लेंगी।

सी एपीआई के उपयोगकर्ता के दृष्टिकोण से, सभी पूर्णांक 64-बिट पर हस्ताक्षर किए गए हैं।

स्तंभ प्रकार

इससे कोई फर्क नहीं पड़ता कि आप पूर्णांक, अहस्ताक्षरित पूर्णांक, BIGINT, या जो कुछ भी रूप में अपने स्तंभ घोषणा करते हैं।Anything with "INT" in it has integer affinity. और जैसा ऊपर बताया गया है, सभी पूर्णांक 64-बिट पर हस्ताक्षरित हैं लेकिन आमतौर पर उस तरह से संग्रहीत नहीं होते हैं।

+0

धन्यवाद। यह वास्तव में मदद नहीं करता है कि चार के बीच भेद: "वाक्य रचनात्मक चीनी" int नाम, सी पूर्णांक (प्लस आंतरिक प्रतिनिधित्व) और संख्याओं के डिस्क संग्रहण को विभिन्न दस्तावेजों में स्पष्ट रूप से जोर नहीं दिया जाता है, और विभिन्न मूल्यों और नामों के बिना दिए जाते हैं बहुत संदर्भ आपका उत्तर प्रत्येक के अंतर और विशिष्टताओं को बताता है, और मुझे सिस्टम की संरचना को वास्तव में समझने की अनुमति देता है। –

0

मेरी वरीयता 64-बिट पूर्णांक के लिए होगी। एक हस्ताक्षरित 32-बिट पूर्णांक का क्लासिक केस 2038 में 1 9 70-01-01 के बाद से सेकंड के साथ सेकेंड के साथ है। http://en.wikipedia.org/wiki/Unix_time और http://en.wikipedia.org/wiki/Year_2038_problem देखें। एक 64-बिट हस्ताक्षरित पूर्णांक के साथ, आप सुरक्षित हैं

+0

फिर भी, 48-बिट भी पर्याप्त से कहीं अधिक होगा, और यह एक एम्बेडेड सिस्टम है, प्रति पंक्ति 2-4 अनावश्यक बाइट्स मुझे स्वतंत्र रूप से छोड़ने की अपेक्षा अधिक है। –

0

क्या आप इसका मतलब बता सकते हैं कि "मेरा लगता है कि यह 4-बाइट हस्ताक्षरित हस्ताक्षरित स्टोर यूनिक्स टाइमस्टैम्प नकारात्मक संख्या के रूप में है।"

यदि आप पहले से ही नहीं हैं तो मैं datatypes (सेक्शन 1.2 दिनांक और समय डेटाटाइप) और date and time functions पर SQLite दस्तावेज़ पढ़ने का सुझाव दूंगा।

+0

http://stackoverflow.com/questions/2401804/negative-dates-in-sqlite –

0

यदि आप एक एम्बेडेड सिस्टम पर हैं जहां स्मृति की स्थिति महत्वपूर्ण है, तो आप 64-बिट मान को कई बिट्स स्थानांतरित करके परिशुद्धता छोड़ने पर विचार कर सकते हैं (जिसके परिणामस्वरूप 2, 4, 8 ... सेकंड की सटीकता 1 सेकंड) और इसे स्टोर करने के लिए 32-बिट मान का उपयोग करना।

+0

वैकल्पिक रूप से, यदि आपका डेटा 1 9 4 दिनों से कम की सीमा को कवर करता है, तो आप एक और हालिया युग का उपयोग कर सकते हैं ताकि सेकंड की गणना केवल 4. – dan04

11

SQLite does not में हस्ताक्षर किए गए प्रकार हैं। यह सीधे मुख्य लेखक, साथ ही docs से है। इसके अलावा, इसमें पूर्णांक के लिए निश्चित कॉलम चौड़ाई नहीं है; वास्तविक ऑन-डिस्क चौड़ाई एक कार्यान्वयन विस्तार है।

SQLite की कोई तिथि या समय डेटाटाइप नहीं है। हालांकि, इसमें डेट फ़ंक्शन हैं जो ISO8601 स्ट्रिंग्स (टेक्स्ट), जूलियन डे नंबर (REAL), और यूनिक्स टाइमस्टैम्प (INTEGER) पर काम कर सकते हैं।

इसलिए यदि आप अपने समय क्षेत्र एक यूनिक्स टाइमस्टैम्प बनाने के लिए, पता है कि यह ऊपर के 64-बिट पर हस्ताक्षर किए पूर्णांक स्टोर कर सकते हैं निर्णय लेते हैं, लेकिन अब आप की दुकान वास्तव में डिस्क पर 32 बिट पर कब्जा करना चाहिए, भले स्रोत मान अगर महत्व देता है एक 64-बिट time_t है।

+0

के बजाय 3 बाइट्स यदि मैं दो उत्तरों स्वीकार कर सकता हूं, तो आपका और दान यह होगा। –