2011-12-08 10 views
7

सही ढंग से सेट करने के लिए कैसे mysql टाइमज़ोन से संबंधित एक अजीब समस्या है।mysql timezone

मेरी वेबसाइट कॉन्फ़िग फ़ाइल में मैं इस लाइन जो समय क्षेत्र सेट है:

mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that 

अजीब हिस्सा है कि अगर मैं इस तरह सही इस के बाद एक और पंक्ति जोड़ें:

$q = mysql_query("SELECT NOW() as now"); 
$row = mysql_fetch_array($row); 
echo $row["now"]; 

को क्रियान्वित करने के बाद वह कोड, समय सही ढंग से प्रदर्शित होता है।

लेकिन, कुछ अन्य प्रश्नों में मैं उन तालिकाओं में पंक्तियां डालता हूं जिनमें कॉलम नाम दिनांक है जो CURRENT_TIMESTAMP को डिफ़ॉल्ट करता है।

पंक्तियाँ इस तरह डाला जाता है:

INSERT INTO `sessions` (`user_id`) VALUES `1` 

लेकिन डीबी में डाला मूल्य अभी भी सर्वर के समय क्षेत्र के वापस बताते हैं (सत्र तालिका एक date स्तंभ CURRENT_TIMESTAMP डिफ़ॉल्ट है): ((

कोई भी विचार कैसे इस के माध्यम से काम करने के लिए?

+0

जब आप सर्वर टाइमज़ोन पर डीबी बिंदु में डाले गए मानों को कहते हैं, तो आप कैसे जांचते हैं? भले ही एक कनेक्शन जहां आपने 'सेट सत्र टाइम_ज़ोन' चाल की थी? – Romain

+0

क्या आप 'INSERT' चलाने से पहले कनेक्शन बंद कर रहे हैं? – ManseUK

+0

मैं इसे phpMyAdmin पर देख रहा हूं, और स्क्रिप्ट निष्पादन के अंत तक नोप कनेक्शन बंद नहीं है –

उत्तर

19

आप यह समझना होगा कि MySQL के कई ti का कहना है मुझे ज़ोन सेटिंग:

  • सिस्टम समय क्षेत्र (मूल रूप से समय क्षेत्र ओएस में सेट)
  • सर्वर समय क्षेत्र (समय MySQL द्वारा इस्तेमाल किया क्षेत्र)
  • ग्राहक समय क्षेत्र (सत्र समय कनेक्शन के प्रति इस्तेमाल किया क्षेत्र)

विवरण के लिए http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html देखें।

दिनांक/समय मान दो अलग अलग तरीकों में जमा हो जाती:

  • सभी यूनिक्स टाइमस्टैम्प आधारित मूल्यों हमेशा यूटीसी में संग्रहीत हैं। जब वे संग्रहीत और पढ़े जाते हैं तो वे फ्लाई पर क्लाइंट टाइम ज़ोन से आंतरिक रूप से परिवर्तित होते हैं। अब() और CURTIME() कार्यों के लिए भी सच है क्योंकि वे टाइमस्टैम्प आधारित हैं।
  • दिनांक, समय और डेटाटाइम कॉलम (जो एक वर्ष-महीने-घंटे घंटे-मिनट-दूसरे प्रारूप में उनके मूल्यों को संग्रहीत करते हैं) समय क्षेत्र सेटिंग्स से प्रभावित नहीं होते हैं और कभी परिवर्तित नहीं होते हैं।

उपर्युक्त से यह स्पष्ट हो जाना चाहिए कि जब आप यूनिक्स टाइमस्टैम्प आधारित कॉलम से पढ़ते हैं तो वे मूल्यों को वास्तव में डीबी में संग्रहीत नहीं करते हैं। वे सर्वर समय क्षेत्र और क्लाइंट समय क्षेत्र का उपयोग कर परिवर्तित कर रहे हैं। यदि आप यांत्रिकी के विवरण को समझ नहीं पाते हैं तो परिणाम भ्रमित हो सकता है।

एक पहले परीक्षण के लिए

SELECT @@global.time_zone, @@session.time_zone; 

वैश्विक समय क्षेत्र हमेशा एक जैसी रहेगी क्रियान्वित करते हुए अपने ग्राहक कार्यक्रमों में से प्रत्येक में वर्तमान सेटिंग्स पता लगाने के लिए प्रयास करें। लेकिन सत्र समय क्षेत्र क्लाइंट एप्लिकेशन से क्लाइंट एप्लिकेशन में भिन्न हो सकता है और आपके पढ़ने और लिखने के कार्यों के परिणाम बदल देगा।

+2

धन्यवाद, वास्तव में बहुत ही प्रबुद्ध! मुझे एहसास हुआ कि phpMyAdmin सर्वर टाइमज़ोन में परिवर्तित किए गए समय प्रदर्शित कर रहा था, लेकिन यदि मैं सत्र टाइमज़ोन सेट करने के बाद उन्हें अपनी स्क्रिप्ट में डीबी से पढ़ता हूं तो वे वास्तव में दिखाई देते हैं, इसलिए यह केवल phpMyAdmin था जो मुझे भ्रमित कर रहा था :) –

+0

@DanyKhalife इस पर टिप्पणी करने के लिए धन्यवाद , सोचा था कि मैं पागल हो रहा था। – Mark

+0

@ जेपीएस ग्रीट उत्तर .. मेरे पास क्वेरी है कि आप MySQL confiq फ़ाइल में क्लाइंट टाइम ज़ोन कैसे सेट करते हैं ??? – goodyzain