मैंने इसे एक समुदाय विकी के रूप में चिह्नित किया है इसलिए अपने अवकाश पर संपादित करने के लिए स्वतंत्र महसूस करें।
वर्ष 2038 समस्या क्या है?
"वर्ष 2038 की समस्या (जिसे यूनिक्स मिलेनियम बग के रूप में भी जाना जाता है, Y2K समस्या के अनुरूप वाई 2 के38) कुछ कंप्यूटर सॉफ़्टवेयर को 2038 से पहले या वर्ष में विफल होने का कारण हो सकता है। समस्या सभी सॉफ़्टवेयर और सिस्टम को प्रभावित करती है जो सिस्टम को एक हस्ताक्षरित 32 के रूप में स्टोर करती है। पूर्णांक, और इस संख्या को 1 जनवरी, 1970 को 00:00:00 UTC के बाद से सेकंड की संख्या के रूप में व्याख्या करें। "
ऐसा क्यों होता है और ऐसा होने पर क्या होता है?
03:14:07 UTC से परे मंगलवार, 19 जनवरी 2038 को 'रैप अराउंड' होगा और आंतरिक रूप से एक नकारात्मक संख्या के रूप में संग्रहीत किया जाएगा, जिसे ये सिस्टम 1338, 1901 में 2038 के बजाय एक समय के रूप में व्याख्या करेंगे। यह कारण है तथ्य यह है कि UNIX युग (1 जनवरी 1970 00:00:00 GMT) के बाद से सेकंड की संख्या एक 32-बिट हस्ताक्षरित पूर्णांक के लिए कंप्यूटर के अधिकतम मूल्य को पार कर जाएगी।
हम इसे कैसे हल करेंगे?
- लंबे डेटा प्रकारों का उपयोग करें (64 बिट्स पर्याप्त है)
- MySQL (या MariaDB) के लिए, यदि आपको
DATE
कॉलम प्रकार का उपयोग करके समय की जानकारी पर विचार करने की आवश्यकता नहीं है । यदि आपको उच्च सटीकता की आवश्यकता है, तो DATETIME
इसके बजाय उपयोग करें TIMESTAMP
। खबरदार कि DATETIME
कॉलम समय-सीमा के बारे में जानकारी संग्रहीत नहीं करते हैं, इसलिए आपके आवेदन को यह जानना होगा कि किस समय का उपयोग किया गया था।
- विकिपीडिया पर वर्णित अन्य संभावित समाधान
- एक दशक से पहले रिपोर्ट किए गए इस बग को ठीक करने के लिए MySQL देवों की प्रतीक्षा करें ।
क्या इसका उपयोग करने के लिए कोई संभावित विकल्प हैं, जो एक समान समस्या पैदा नहीं करते हैं?
डेटाबेस में स्टोर करने की तारीखों के लिए बड़े प्रकारों का उपयोग करने के लिए जहाँ भी संभव हो कोशिश करें: 64-बिट्स पर्याप्त है - जीएनयू सी और पोसिक्स / एसयूएस, या sprintf('%u'...)
पीएचपी या बीसीमैथ एक्सटेंशन में एक लंबा लंबा प्रकार ।
भले ही हम 2038 में अभी तक नहीं हैं, लेकिन कुछ संभावित रूप से ब्रेकिंग केस के मामले क्या हैं?
इसलिए एक MySQL DATETIME की सीमा 1000-9999 है, लेकिन TIMESTAMP की रेंज केवल 1970-2038 है। यदि आपका सिस्टम जन्मतिथि, भविष्य की फ़ॉरवर्ड डेट्स (जैसे 30 वर्ष के बंधक), या इसी तरह के स्टोर करता है, तो आप पहले से ही इस बग में चलने वाले हैं। यदि यह समस्या होने वाली है तो फिर से TIMESTAMP का उपयोग न करें।
जब हम वास्तव में होते हैं, तो तथाकथित समस्या से बचने के लिए, TIMESTAMP का उपयोग करने वाले मौजूदा अनुप्रयोगों के लिए हम क्या कर सकते हैं?
कुछ पीएचपी अनुप्रयोग अभी भी 2038 के आसपास होंगे, हालांकि यह वेब के रूप में मुश्किल है क्योंकि अभी तक शायद ही कोई विरासत मंच है।
यहां एक डेटाबेस टेबल कॉलम को बदलने के TIMESTAMP
लिए एक प्रक्रिया है DATETIME
। यह एक अस्थायी कॉलम बनाने के साथ शुरू होता है:
# rename the old TIMESTAMP field
ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL;
# create a new DATETIME column of the same name as your old column
ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL;
# update all rows by populating your new DATETIME field
UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp);
# remove the temporary column
ALTER TABLE `myTable` DROP `temp_myTimestamp`
साधन