2010-11-27 8 views
50

मेरे पास एक लॉगिंग टेबल है जिसमें सांख्यिकीय कारणों के लिए लाखों लेखन होंगे। सभी कॉलम int विदेशी कुंजी हैं। मैं प्रत्येक पंक्ति के लिए एक टाइमस्टैम्प कॉलम भी जोड़ने जा रहा हूं। यह देखते हुए कि DATETIME 8 बिट लेता है - मैं स्टोरेज स्पेस (और उस कॉलम पर इंडेक्स) को आधा में कटौती करने के लिए int(10) unsigned का उपयोग करूँगा।इंटिक्स टाइमस्टैम्प को इंट कॉलम में कैसे संग्रहीत किया जाना चाहिए?

हालांकि, मुझे आश्चर्य है कि यह कॉलम अब काम नहीं करेगा। 1 9 जनवरी 2038 को 3:14:07 पूर्वाह्न पर 9, 99, 99, 999 मूल्य यूनिक्स टाइमस्टैम्प के लिए एक समस्या होगी - लेकिन MySQL में एक हस्ताक्षरित int केवल 4,294,967,295 तक रहता है और टाइमस्टैम्प 42 9 4 9 672 9 5 मेरे PHP एप्लिकेशन में एक अवैध संख्या दिखा रहा है।

तो इसका क्या अर्थ है? क्या MySQL में भंडारण int टाइमस्टैम्प का अंत 2021 में कभी-कभी होने वाला है क्योंकि यह 99 99 99 99 99 तक इसे सभी तरह से नहीं बना सकता है?

उत्तर:

  1. 2147483647 2038 (नहीं 9999999999) है तो वहाँ कोई समस्या नहीं है।
  2. unsigned की आवश्यकता नहीं है क्योंकि 2147483647 एक हस्ताक्षरित MySQL int में ठीक फिट बैठता है।
+1

मैं इसके बारे में चिंता करूंगा। ;) – Stephen

+3

यदि आपके पास 10 मिलियन पंक्तियां थीं, तो आप एक अतिरिक्त अतिरिक्त 9.5 एमबी का उपयोग करेंगे ... वास्तव में DATETIME प्रकार का उपयोग करें। –

+2

आपको यह ध्यान में रखना चाहिए कि डेटटाइम प्रकार का उद्देश्य आपको इस समस्या से निपटने से बचाने के लिए है। – Nick

उत्तर

81

मानक यूनिक्स टाइमस्टैम्प एक हस्ताक्षरित 32 बिट पूर्णांक हैं, जो MySQL में नियमित "int" कॉलम है। 9, 999, 999, 999 स्टोर करने का कोई तरीका नहीं है, जैसा कि प्रतिनिधित्व सीमा के बाहर है - किसी भी प्रकार का 32 बिट इंट अधिकतम 4,294, 9 67,295 हो सकता है। उच्चतम हस्ताक्षर 32 बिट में 2,147,483,647 है।

यदि यूनिक्स टाइमस्टैम्प 64 बिट डेटा प्रकार पर जाते हैं, तो आपको उन्हें स्टोर करने के लिए एक MySQL "bigint" का उपयोग करना होगा।

int(10) के लिए, (10) भाग केवल प्रदर्शन उद्देश्यों के लिए है। MySQL अभी भी संख्या को स्टोर करने के लिए आंतरिक रूप से पूर्ण 32 बिट का उपयोग करेगा, लेकिन जब भी आप तालिका पर चयन करते हैं तो केवल 10 प्रदर्शित करें।

+3

मुझे खुशी है कि आपने जो कहा है, उसकी पुष्टि की है, लेकिन तारीखों को संग्रहीत करने के लिए इसका क्या अर्थ है, इस सवाल के बारे में क्या है? – Xeoncross

+1

मानक यूनिक्स टाइमस्टैम्प बिना किसी रूपांतरण के PHP में मानक हस्ताक्षरित 'int' कॉलम में जाएगा। हस्ताक्षरित यूनिक्स टाइम स्टैंप जैसी कोई चीज़ नहीं है - यह मानक libc में नहीं है, इसलिए आपको 2,147,483,648 -> 4,294,967,295 के बीच किसी भी टाइमस्टैम्प के बारे में चिंता करने की आवश्यकता नहीं है।PHP का टाइमस्टैम्प समर्थन सीधे libc पर भी आधारित है, इसलिए PHP किसी भी हस्ताक्षरित टाइमस्टैम्प को स्वीकार नहीं करेगा। –

+2

इसका मतलब है कि आप 2^31-1 से अधिक की तारीखों को स्टोर नहीं कर सकते (यह 2147483647 है, जो 2038 तक सेकंड के रूप में समय का प्रतिनिधित्व कर सकता है। 9, 999, 999,999 आपको 2287 के आसपास ले जाएगा)। यह एक ज्ञात समस्या है; http: //stackoverflow.com/questions/36239/what-should-we-do-to-prepare-for-2038 – nos

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