TIME
मान हमेशा MySQL में 3 बाइट्स पर संग्रहीत होते थे। लेकिन प्रारूप संस्करण 5.6 पर बदल गया .4
. मुझे संदेह है कि यह पहली बार नहीं था जब यह बदल गया। लेकिन दूसरा परिवर्तन, यदि कोई था, तो बहुत पहले हुआ था और इसका कोई सार्वजनिक प्रमाण नहीं है। गिटहब पर MySQL स्रोत कोड इतिहास संस्करण 5.5 से शुरू होता है (सबसे पुरानी प्रतिबद्धता मई 2008 से है) लेकिन मैं जो परिवर्तन ढूंढ रहा हूं वह 2001-2002 के आसपास हुआ था (MySQL 4 2003 में लॉन्च किया गया था)
वर्तमान प्रारूप, जैसा कि दस्तावेज़ीकरण में वर्णित है, सेकंड के लिए 6 बिट का उपयोग करता है (संभावित मान:0
से 63
), मिनटों के लिए 6 बिट, घंटों के लिए 10 बिट (संभावित मान:0
करने के लिए 1023
), साइन के लिए 1 बिट (पहले से उल्लिखित अंतराल के नकारात्मक मान जोड़ें) और 1 बिट अप्रयुक्त है और "भविष्य के एक्सटेंशन के लिए आरक्षित" लेबल किया गया है।
यह समय घटकों (घंटे, मिनट, सेकंड) के साथ काम करने के लिए अनुकूलित है और ज्यादा जगह बर्बाद नहीं करता है। इस प्रारूप का उपयोग करके मूल्यों को -1023:59:59
. के बीच संग्रहीत करना संभव है और +1023:59:59
. हालाँकि MySQL घंटों की संख्या को 838
. तक सीमित करता है , शायद कुछ समय पहले लिखे गए अनुप्रयोगों के साथ पिछड़े संगतता के लिए, जब मुझे लगता है कि यह सीमा थी।
संस्करण 5.6.4 तक, TIME
मान 3 बाइट्स पर भी संग्रहीत किए गए थे और घटकों को days * 24 * 3600 + hours * 3600 + minutes * 60 + seconds
के रूप में पैक किया गया था। . इस प्रारूप को टाइमस्टैम्प के साथ काम करने के लिए अनुकूलित किया गया था (क्योंकि यह वास्तव में एक टाइमस्टैम्प था)। इस प्रारूप का उपयोग करके मूल्यों को लगभग -2330
. की सीमा में संग्रहीत करना संभव होगा करने के लिए +2330
घंटे। मानों की इतनी बड़ी रेंज उपलब्ध होने के बावजूद, MySQL अभी भी मानों को -838
. तक सीमित कर रहा था करने के लिए +838
घंटे।
बग #11655
था MySQL 4 पर। TIME
लौटाना संभव था -838..+838
. के बाहर के मान नेस्टेड का उपयोग करके श्रेणी SELECT
बयान। यह एक विशेषता नहीं बल्कि एक बग थी और इसे ठीक कर दिया गया था।
मानों को इस सीमा तक सीमित करने और TIME
. उत्पन्न करने वाले कोड के किसी भी भाग को सक्रिय रूप से बदलने का एकमात्र कारण इसके बाहर के मान पश्चगामी संगतता थे।
मुझे संदेह है कि MySQL 3 ने एक अलग प्रारूप का उपयोग किया है, जिस तरह से डेटा पैक किया गया था, मान्य मानों को -838..+838
तक सीमित कर दिया था। घंटे।
मौजूदा MySQL के सोर्स कोड मुझे यह दिलचस्प सूत्र मिला:
#define TIME_MAX_VALUE (TIME_MAX_HOUR*10000 + TIME_MAX_MINUTE*100 + TIME_MAX_SECOND)
आइए इस समय MAX
. पर ध्यान न दें ऊपर इस्तेमाल किए गए नामों का हिस्सा है और आइए केवल वही याद रखें TIME_MAX_MINUTE
और TIME_MAX_SECOND
00
. के बीच की संख्याएं हैं और 59
. सूत्र केवल एक पूर्णांक संख्या में घंटे, मिनट और सेकंड को जोड़ता है। उदाहरण के लिए, मान 170:29:45
हो जाता है 1702945
।
यह सूत्र निम्नलिखित प्रश्न उठाता है:यह देखते हुए कि TIME
मान 3 बाइट्स पर साइन के साथ संग्रहीत होते हैं, अधिकतम सकारात्मक मान क्या है जिसे इस तरह से दर्शाया जा सकता है?
हम जिस मान की तलाश कर रहे हैं वह है 0x7FFFFF
कि दशमलव संकेतन में 8388607
. है . चूंकि अंतिम चार अंक (8607
) को मिनटों के रूप में पढ़ा जाना चाहिए (86
) और सेकंड (07
) और उनका अधिकतम मान्य मान 59
. है , ऊपर दिए गए सूत्र का उपयोग करके साइन के साथ 3 बाइट्स पर संग्रहीत किया जा सकने वाला सबसे बड़ा मान 8385959
है . जो, TIME
. के रूप में है +838:59:59
. टा-दा!
अंदाज़ा लगाओ? C
. का टुकड़ा ऊपर सूचीबद्ध कोड इससे निकाला गया था:
/* Limits for the TIME data type */
#define TIME_MAX_HOUR 838
#define TIME_MAX_MINUTE 59
#define TIME_MAX_SECOND 59
#define TIME_MAX_VALUE (TIME_MAX_HOUR*10000 + TIME_MAX_MINUTE*100 + TIME_MAX_SECOND)
मुझे यकीन है कि MySQL 3 इस तरह से TIME
को बनाए रखता है आंतरिक रूप से मूल्य। इस प्रारूप ने सीमा की सीमा को लागू किया, और बाद के संस्करणों पर पश्चगामी संगतता आवश्यकता ने हमारे दिनों के लिए सीमा का प्रचार किया।