Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या MySQL का टाइमज़ोन UTC पर सेट होना चाहिए?

ऐसा लगता है कि इससे कोई फर्क नहीं पड़ता कि सर्वर पर कौन सा टाइमज़ोन है, जब तक आपके पास वर्तमान टाइमज़ोन के लिए सही समय निर्धारित है, आपके द्वारा स्टोर किए जाने वाले डेटाटाइम कॉलम के टाइमज़ोन को जानें, और डेलाइट सेविंग टाइम के मुद्दों से अवगत हों।

दूसरी ओर, यदि आपके पास उन सर्वरों के समय-क्षेत्र का नियंत्रण है जिनके साथ आप काम करते हैं तो आप आंतरिक रूप से यूटीसी पर सब कुछ सेट कर सकते हैं और कभी भी समय क्षेत्र और डीएसटी के बारे में चिंता न करें।

यहाँ कुछ नोट्स हैं जो मैंने अपने और दूसरों के लिए चीटशीट के रूप में टाइमज़ोन के साथ काम करने के तरीके के बारे में एकत्र किए हैं, जो इस बात को प्रभावित कर सकते हैं कि व्यक्ति अपने सर्वर के लिए किस समय क्षेत्र का चयन करेगा और वह दिनांक और समय को कैसे संग्रहीत करेगा।

MySQL टाइमज़ोन चीटशीट

नोट:

  1. समय क्षेत्र बदलने से संग्रहीत डेटाटाइम या टाइमस्टैम्प नहीं बदलेगा , लेकिन यह टाइमस्टैम्प कॉलम से भिन्न डेटाटाइम का चयन करेगा

  2. चेतावनी! UTC में लीप सेकंड होते हैं, ये '2012-06-30 23:59:60' जैसे दिखते हैं और पृथ्वी के घूमने की गति धीमी होने के कारण 6 महीने की पूर्व सूचना के साथ यादृच्छिक रूप से जोड़े जा सकते हैं

  3. GMT सेकंड को भ्रमित करता है, यही वजह है कि UTC का आविष्कार किया गया था।

  4. चेतावनी! डेलाइट सेविंग टाइम के कारण अलग-अलग क्षेत्रीय समय क्षेत्र समान डेटाटाइम मान उत्पन्न कर सकते हैं

  5. टाइमस्टैम्प कॉलम केवल दिनांक 1970-01-01 00:00:01 से 2038-01-19 03:14:07 UTC का समर्थन करता है, क्योंकि एक सीमा

  6. आंतरिक रूप से एक MySQL टाइमस्टैम्प कॉलम UTC के रूप में संग्रहित किया जाता है लेकिन किसी तिथि का चयन करते समय MySQL स्वचालित रूप से इसे वर्तमान सत्र समय क्षेत्र में परिवर्तित कर देगा।

    टाइमस्टैम्प में दिनांक संग्रहीत करते समय, MySQL मान लेगा कि दिनांक वर्तमान सत्र समय क्षेत्र में है और इसे UTC फ़ॉरस्टोरेज में परिवर्तित कर देगा।

  7. MySQL आंशिक तिथियों को डेटाटाइम कॉलम में संग्रहीत कर सकता है, ये "2013-00-00 04:00:00" जैसे दिखते हैं

  8. MySQL स्टोर करता है "0000-00-00 00:00:00" यदि आप एक डेटाटाइम कॉलम को NULL के रूप में सेट करते हैं, जब तक कि आप इसे बनाते समय नल को अनुमति देने के लिए विशेष रूप से कॉलम सेट नहीं करते हैं।

  9. इसे पढ़ें

यूटीसी प्रारूप में टाइमस्टैम्प कॉलम चुनने के लिए

कोई फर्क नहीं पड़ता कि वर्तमान MySQL सत्र किस समयक्षेत्र में है:

SELECT 
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime` 
FROM `table_name`

आप सेवर या वैश्विक या वर्तमान सत्र समयक्षेत्र को यूटीसी पर भी सेट कर सकते हैं और फिर इस तरह टाइमस्टैम्प का चयन कर सकते हैं:

SELECT `timestamp_field` FROM `table_name`

UTC में वर्तमान डेटाटाइम चुनने के लिए:

SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP;
SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00');

उदाहरण परिणाम:2015-03-24 17:02:41

सत्र समय क्षेत्र में वर्तमान दिनांक समय का चयन करने के लिए

SELECT NOW();
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();

उस समय क्षेत्र का चयन करने के लिए जो सर्वर के लॉन्च होने पर सेट किया गया था

SELECT @@system_time_zone;

मास्को समय के लिए "MSK" या "+04:00" लौटाता है, उदाहरण के लिए, एक MySQL बग है (या था) जहां यदि एक संख्यात्मक ऑफसेट पर सेट किया जाता है तो यह डेलाइट बचत समय को समायोजित नहीं करेगा

वर्तमान समय क्षेत्र प्राप्त करने के लिए

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

यदि आपका समय क्षेत्र +2:00 है, तो यह 02:00:00 वापस आ जाएगा।

वर्तमान UNIX टाइमस्टैम्प प्राप्त करने के लिए (सेकंड में):

SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP();

टाइमस्टैम्प कॉलम को UNIX टाइमस्टैम्प के रूप में प्राप्त करने के लिए

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

UNIX टाइमस्टैम्प के रूप में UTC डेटाटाइम कॉलम प्राप्त करने के लिए

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`

एक सकारात्मक UNIX टाइमस्टैम्प पूर्णांक से वर्तमान समयक्षेत्र डेटाटाइम प्राप्त करें

SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`

UNIX टाइमस्टैम्प से UTC डेटाटाइम प्राप्त करें

SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00') 
FROM `table_name`

नकारात्मक UNIX टाइमस्टैम्प पूर्णांक से वर्तमान टाइमज़ोन डेटाटाइम प्राप्त करें

SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND) 

ऐसे 3 स्थान हैं जहां MySQL में टाइमज़ोन सेट किया जा सकता है:

नोट:एक समय क्षेत्र को 2 प्रारूपों में सेट किया जा सकता है:

  1. यूटीसी से ऑफसेट:'+00:00', '+10:00' या '-6:00'
  2. एक नामित समय क्षेत्र के रूप में:'यूरोप/हेलसिंकी', 'यूएस/पूर्वी', या 'मेट'
<ब्लॉकक्वॉट>

नामांकित समय क्षेत्रों का उपयोग केवल तभी किया जा सकता है जब mysql डेटाबेस में समय क्षेत्र सूचना तालिकाएँ बनाई और भरी गई हों।

फ़ाइल में "my.cnf"

default_time_zone='+00:00'

या

timezone='UTC'

@@global.time_zone चर

यह देखने के लिए कि वे किस मान पर सेट हैं

SELECT @@global.time_zone;

इसके लिए मान सेट करने के लिए इनमें से किसी एक का उपयोग करें:

SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone='+00:00';

@@session.time_zone चर

SELECT @@session.time_zone;

इसे सेट करने के लिए किसी एक का उपयोग करें:

SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";

दोनों "@@global.time_zone वेरिएबल" और "@@session.time_zone वेरिएबल" "सिस्टम" लौटा सकते हैं, जिसका अर्थ है कि वे "my.cnf" में सेट किए गए टाइमज़ोन का उपयोग करते हैं।

समय-क्षेत्र के नाम काम करने के लिए (यहां तक ​​कि डिफ़ॉल्ट-समय-क्षेत्र के लिए भी) आपको अपनी समय-क्षेत्र जानकारी तालिकाएँ सेट करनी होंगी जिन्हें पॉप्युलेट करने की आवश्यकता है: http://dev.mysql.com/doc /refman/5.1/hi/time-zone-support.html

नोट:आप ऐसा नहीं कर सकते क्योंकि यह NULL लौटाएगा:

SELECT 
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime` 
FROM `table_name`

mysql टाइमज़ोन टेबल सेटअप करें

CONVERT_TZ . के लिए काम करने के लिए, आपको समय-क्षेत्र तालिकाओं को पॉप्युलेट करने की आवश्यकता है

SELECT * FROM mysql.`time_zone` ;
SELECT * FROM mysql.`time_zone_leap_second` ;
SELECT * FROM mysql.`time_zone_name` ;
SELECT * FROM mysql.`time_zone_transition` ;
SELECT * FROM mysql.`time_zone_transition_type` ;

अगर वे खाली हैं, तो इस कमांड को चलाकर उन्हें भरें

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

यदि यह आदेश आपको त्रुटि देता है "पंक्ति 1 पर कॉलम 'संक्षिप्त नाम' के लिए डेटा बहुत लंबा है ", तो यह टाइमज़ोन संक्षिप्त नाम के अंत में एक NULL वर्ण जोड़े जाने के कारण हो सकता है

इसे चलाने के लिए ठीक किया जा रहा है

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql

echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql

mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql

(सुनिश्चित करें कि आपके सर्वर डीएसटी नियम अद्यतित हैं zdump -v Europe/Moscow | grep 2011 https://chrisjean.com/updating-daylight- Saving-time- ऑन-लिनक्स/ )

हर समय क्षेत्र के लिए संपूर्ण DST (डेलाइट सेविंग टाइम) ट्रांज़िशन इतिहास देखें

SELECT 
tzn.Name AS tz_name,
tztt.Abbreviation AS tz_abbr,
tztt.Is_DST AS is_dst,
tztt.`Offset` AS `offset`,
DATE_ADD('1970-01-01 00:00:00',INTERVAL tzt.Transition_time SECOND)  AS transition_date
FROM mysql.`time_zone_transition` tzt
INNER JOIN mysql.`time_zone_transition_type` tztt USING(Time_zone_id, Transition_type_id)
INNER JOIN mysql.`time_zone_name` tzn USING(Time_zone_id)
-- WHERE tzn.Name LIKE 'Europe/Moscow' -- Moscow has weird DST changes
ORDER BY tzt.Transition_time ASC

CONVERT_TZ उपरोक्त तालिकाओं में नियमों और आपके द्वारा उपयोग की जाने वाली तारीख के आधार पर कोई भी आवश्यक डीएसटी परिवर्तन भी लागू होता है।

नोट:
दस्तावेज़ों , टाइम_ज़ोन के लिए आपके द्वारा सेट किया गया मान नहीं बदलता है, उदाहरण के लिए यदि आप इसे "+01:00" के रूप में सेट करते हैं, तो टाइम_ज़ोन को यूटीसी से ऑफ़सेट के रूप में सेट किया जाएगा, जो डीएसटी का पालन नहीं करता है, इसलिए यह वही रहेगा साल भर।

केवल नामित समय क्षेत्र डेलाइट सेविंग टाइम के दौरान समय बदलेगा।

संक्षिप्ताक्षर जैसे CET हमेशा सर्दियों का समय रहेगा और CEST गर्मियों का समय होगा जबकि +01:00 हमेशा UTC रहेगा समय + 1 घंटा और दोनों डीएसटी के साथ नहीं बदलेंगे।

system टाइमज़ोन होस्ट मशीन का टाइमज़ोन होगा जहाँ mysql स्थापित है (जब तक कि mysql इसे निर्धारित करने में विफल रहता है)

आप डीएसटी के साथ काम करने के बारे में अधिक पढ़ सकते हैं यहां

प्रसिद्ध जॉन स्कीट द्वारा यूटीसी का उपयोग कब नहीं करना चाहिए:https://codeblog.jonskeet.uk/2019/03/27/storing-utc-is-not-a-silver-bullet/ (उदाहरण के लिए, भविष्य में एक शेड्यूल्ड इवेंट जो एक समय का प्रतिनिधित्व करता है, न कि तत्काल समय का)

संबंधित प्रश्न:

स्रोत:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सॉकेट '/var/lib/mysql/mysql.sock' के माध्यम से स्थानीय MySQL सर्वर से कनेक्ट नहीं हो सकता (2)

  2. लार्वा वाक्पटु मॉडल द्वारा तीन तालिका में कैसे शामिल हों

  3. चरित्र सेट और संयोजन का वास्तव में क्या अर्थ है?

  4. MySQL में एक कॉलम के कैरेक्टर सेट और कॉलेशन को कैसे सेट करें

  5. PDO MySQL:PDO::ATTR_EMULATE_PREPARES का प्रयोग करें या नहीं?