মাইএসকিউএল এর উচিত কি এর টাইমজোনটি ইউটিসি তে সেট করা উচিত?


149

Https://serverfault.com/questions/191331/should-servers-have-their-timezone-set-to-gmt-utc এর প্রশ্ন অনুসরণ করুন

মাইএসকিউএল টাইমজোনটি ইউটিসি-তে সেট করা উচিত বা সার্ভার বা পিএইচপি সেট করা একই টাইমজোন হিসাবে সেট করা উচিত? (এটি ইউটিসি না হলে)

উপকারিতা কি কি?



ইউটিসি কোনও সময় অঞ্চল নয়। ইউটিসি একটি মান, জিএমটি একটি সময় অঞ্চল। zachholman.com/talk/utc-is-enough-for-everone-right
agoldev

আরেকটি বড় কারণ ইউটিসি ব্যবহার করতে dba.stackexchange.com/questions/161416/...
টিমো Huovinen

উত্তর:


533

দেখে মনে হচ্ছে যে বর্তমান টাইমজোনটির জন্য আপনার সময় নির্ধারণের সময় যতক্ষণ সার্ভারে টাইমজোন রয়েছে তাতে কিছু আসে যায় না, আপনি যে ডেটটাইম কলামগুলি সঞ্চয় করেন তার টাইমজোনটি জানেন এবং দিবালোকের সঞ্চয় সময় সহ সমস্যাগুলি সম্পর্কে সচেতন হন।

অন্যদিকে আপনি যে সার্ভারগুলির সাথে কাজ করেন তার টাইমজোনগুলির নিয়ন্ত্রণ যদি আপনার থাকে তবে আপনি অভ্যন্তরীণভাবে ইউটিসি-তে সেট হয়ে যেতে পারেন এবং টাইমজোন এবং ডিএসটি নিয়ে কখনই চিন্তা করবেন না।

আমি কীভাবে নিজের এবং অন্যদের জন্য চিটপত্রের ফর্ম হিসাবে টাইমজোনগুলির সাথে কীভাবে কাজ করব তা সংগ্রহ করার জন্য এখানে কিছু নোট দেওয়া আছে যা ব্যক্তি তার সার্ভারের জন্য টাইমজোনটি কী বেছে নেবে এবং কীভাবে সে তারিখ এবং সময় সঞ্চয় করবে তা প্রভাবিত করতে পারে।

মাইএসকিউএল টাইমজোন চিটশিট

মন্তব্য:

  1. টাইমজোন পরিবর্তন করা সঞ্চিত ডেটটাইম বা টাইমস্ট্যাম্প পরিবর্তন করবে না , তবে এটি টাইমস্ট্যাম্প কলাম থেকে আলাদা ডেটটাইম নির্বাচন করবে
  2. সতর্কবাণী! ইউটিসি'র লিপ সেকেন্ড রয়েছে, এগুলি দেখতে '2012-06-30 23:59:60' এর মতো এবং পৃথিবীর আবর্তনের গতি কমার কারণে 6 মাস পূর্বে নোটিশ সহ এলোমেলোভাবে যুক্ত করা যেতে পারে
  3. GMT কয়েক সেকেন্ড বিভ্রান্ত করে, এজন্য ইউটিসি আবিষ্কার হয়েছিল was

  4. সতর্কবাণী! দিবালোক সঞ্চয়ের সময়কালের কারণে বিভিন্ন আঞ্চলিক সময় অঞ্চল একই তারিখের মান উত্পাদন করতে পারে

  5. টাইমস্ট্যাম্প কলাম কেবল সীমাবদ্ধতার কারণে 1970-01-01 00:00:01 থেকে 2038-01-19 03:14:07 ইউটিসি তারিখগুলি সমর্থন করে ।
  6. অভ্যন্তরীণভাবে একটি মাইএসকিউএল টাইমস্ট্যাম্প কলামটি ইউটিসি হিসাবে সংরক্ষণ করা হয় তবে কোনও তারিখ নির্বাচন করার সময় মাইএসকিউএল এটিকে স্বয়ংক্রিয়ভাবে বর্তমান সেশন টাইমজোনতে রূপান্তরিত করে।

    টাইমস্ট্যাম্পে কোনও তারিখ সংরক্ষণ করার সময়, মাইএসকিউএল ধরে নেবে যে তারিখটি বর্তমান সেশনের টাইমজোনটিতে রয়েছে এবং স্টোরেজের জন্য এটি ইউটিসিতে রূপান্তরিত করে।

  7. মাইএসকিউএল ডেটটাইম কলামগুলিতে আংশিক তারিখগুলি সঞ্চয় করতে পারে, এটি "2013-00-00 04:00:00" এর মতো দেখায়
  8. মাইএসকিউএল "0000-00-00 00:00:00" সংরক্ষণ করে যদি আপনি একটি ডেটটাইম কলাম NULL হিসাবে সেট করেন, যদি না আপনি নির্দিষ্টভাবে কলামটি তৈরি করার সময় শূন্য করার অনুমতি দেয়।
  9. এটি পড়ুন

ইউটিসি ফর্ম্যাটে একটি টাইমস্ট্যাম্প কলাম নির্বাচন করতে

বর্তমান মাইএসকিউএল সেশনে টাইমজোনটি কী তা বিবেচ্য নয়:

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

আপনি ইউটিসি তে সেভার বা গ্লোবাল বা বর্তমান সেশন টাইমজোন সেট করতে পারেন এবং তারপরে টাইমস্ট্যাম্পটি নির্বাচন করতে পারেন:

SELECT `timestamp_field` FROM `table_name`

ইউটিসিতে বর্তমান তারিখের সময়টি নির্বাচন করতে:

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;

উদাহরণস্বরূপ, মস্কোর সময়ের জন্য "এমএসকে" বা "+04: 00" প্রদান করে, এখানে মাইএসকিউএল বাগ রয়েছে (বা ছিল) যেখানে যদি একটি সংখ্যাসূচক অফসেট সেট করা থাকে তবে এটি দিবালোক সঞ্চয় সময় সামঞ্জস্য করে না

বর্তমান সময় অঞ্চল পেতে

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

আপনার টাইমজোনটি +2: 00 হলে এটি ফিরে আসবে 02:00:00।

বর্তমান ইউনিক্স টাইমস্ট্যাম্প পেতে (সেকেন্ডে):

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

UNIX টাইমস্ট্যাম্প হিসাবে টাইমস্ট্যাম্প কলাম পেতে

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

ইউনিক্স টাইমস্ট্যাম্প হিসাবে একটি ইউটিসি ডেটটাইম কলাম পেতে

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

ইতিবাচক ইউনিক্স টাইমস্ট্যাম্প পূর্ণসংখ্যার থেকে বর্তমান টাইমজোন ডেটটাইম পান

SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`

ইউনিক্স টাইমস্ট্যাম্প থেকে একটি ইউটিসি ডেটটাইম পান

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 টি জায়গা রয়েছে যেখানে মাইএসকিউএলে টাইমজোন সেট করা যেতে পারে:

দ্রষ্টব্য: একটি সময় অঞ্চল 2 ফর্ম্যাটে সেট করা যেতে পারে:

  1. ইউটিসি থেকে অফসেট: '+00: 00', '+10: 00' বা '-6: 00'
  2. নামযুক্ত সময় অঞ্চল হিসাবে: 'ইউরোপ / হেলসিঙ্কি', 'মার্কিন / পূর্ব', বা 'এমইটি'

মাইএসকিএল ডাটাবেজে টাইম জোনের তথ্য সারণী তৈরি এবং পপুলেটেড করা হলে নামযুক্ত সময় অঞ্চলগুলি ব্যবহার করা যেতে পারে।

"my.cnf" ফাইলটিতে

default_time_zone='+00:00'

অথবা

timezone='UTC'

@@ গ্লোবাল.টাইম_জোন ভেরিয়েবল

তারা কি মান সেট করা হয় তা দেখতে

SELECT @@global.time_zone;

এর জন্য একটি মান সেট করতে একটি ব্যবহার করুন:

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

@@ সেশন.টাইম_জোন ভেরিয়েবল

SELECT @@session.time_zone;

সেট করতে এটি একটি ব্যবহার করুন:

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

"@@ গ্লোবাল.টাইম_জোন ভেরিয়েবল" এবং "@@ সেশন.টাইম_জোন ভেরিয়েবল" উভয়ই "SYSTEM" প্রত্যাবর্তন করতে পারে যার অর্থ তারা "my.cnf" তে টাইমজোন সেটটি ব্যবহার করে।

টাইমজোন নামগুলি কাজ করার জন্য (এমনকি ডিফল্ট-সময়-অঞ্চলের জন্যও) আপনাকে অবশ্যই আপনার টাইমজোন তথ্য সারণীগুলি পপুলেট করতে হবে: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support। এইচটিএমএল

দ্রষ্টব্য: আপনি এটি করতে পারবেন না কারণ এটি নাল ফিরে আসবে:

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

মাইএসকিএল টাইমজোন সারণী সেটআপ করুন

জন্য 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-on-linux/ )

প্রতিটি টাইমজোনের জন্য সম্পূর্ণ ডিএসটি (দিবালোক সংরক্ষণের সময়) রূপান্তর ইতিহাস দেখুন

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 ইনস্টল করা হয়েছে তার সময় অঞ্চল হতে হবে (যদি না মাইএসকিউএল তা নির্ধারণ করতে ব্যর্থ)

আপনি এখানে ডিএসটি নিয়ে কাজ করার বিষয়ে আরও পড়তে পারেন

সম্পর্কিত প্রশ্নগুলি:

সূত্র:


সুতরাং আমার কাছে যদি আমার কলামের টাইমস্ট্যাম্প সেট করা আছে। এবং আমার টাইমজোনটি +12: 00, এবং আমি একটি ইউটিসি ভিত্তিক তারিখ / সময় ব্যবহার করে একটি কলাম আপডেট করতে চাই, আপডেট বিবৃতিতে টাইমজোনকে অন্তর্ভুক্ত করার কোনও উপায় আছে, বা আমার রূপান্তর_tz ব্যবহার করা উচিত? যেমন। আপডেট tableসেট modified= '2016-07-07 08:10 +00: 00'
বাম্পারবক্স

2
@ বিম্বারবক্স মাইএসকিএল সর্বদা ধরে নেয় যে আপনি টাইমস্ট্যাম্প কলামটি যে তারিখটি দিচ্ছেন তা মাইএসকিএল সার্ভারের একই টাইমজোনে রয়েছে, সুতরাং আপডেটের জন্য আপনার তারিখটি আপনার +12: 00 টাইমজোন থেকে আপনার মাইএসকিএল সার্ভারের টাইমজোনকে রূপান্তর করতে হবে। এই কারণেই আমি মাইএসকিএল সার্ভারে ইউটিসি ব্যবহার করি এবং সংরক্ষণের আগে যে তারিখটিকে ইউটিসি তে রূপান্তর করি।
টিমো হুভিনেন

5
এসও ব্যবহারের বছরগুলিতে আমি এসেছি সেরা, সবচেয়ে তথ্যবহুল উত্তরগুলির মধ্যে একটি। ধন্যবাদ.
মিত্য

সতর্কতামূলক !!! স্থানীয় সময় ডিএসটি টাইমজোন থেকে যে কোনও রূপান্তর বা রূপান্তরকরণ, প্রতিবছর দিবালোকের সঞ্চয় শেষে এক ঘন্টা এক ঘন্টা ভুল হয়ে যাবে। এটি প্যারামিটারগুলির একটি যেখানে `@@ সেশন.টাইম_জোন যেখানে UNIX_TIMESTAMP(NOW());আপনার সমস্ত ব্যবহারকেও প্রভাবিত করে CONVERT_TZ()। ইউটিসি তারিখের সময়কে ইউনিক্স টাইমস্ট্যাম্পগুলিতে নির্ভরযোগ্যভাবে রূপান্তর করার জন্য, আপনাকে মূলত সেশন সময়_জোনটি প্রথমে সেট করতে হবে।
Doin থেকে

1
@ ফ্লিম পুরোপুরি ঠিক, আমি কিছুক্ষণ আগে এটি ঠিক করতে ভুলে গেছি।
টিমো হুভিনেন

3

এটি একটি কার্যকরী উদাহরণ:

jdbc:mysql://localhost:3306/database?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Europe/Moscow

2

পিএইচপি এবং মাইএসকিউএলের নিজস্ব ডিফল্ট টাইমজোন কনফিগারেশন রয়েছে। আপনার ডেটা বেস এবং ওয়েব অ্যাপ্লিকেশনের মধ্যে আপনার সময়কে একত্রীকরণ করা উচিত, অন্যথায় আপনি কিছু সমস্যা চালাতে পারেন।

এই টিউটোরিয়ালটি পড়ুন: আপনার পিএইচপি এবং মাইএসকিউএল টাইমজোনগুলি কীভাবে সমন্বয় করবেন


এটি মূলত দুটি লাইনের কোড: date_default_timezone_set("America/Los_Angeles");এবং mysql_query("SET time_zone='" . date('P', time()) . "'");খুব মার্জিতভাবে কাজ করেছে!
নুমেনন

3
@ নুমেনন এর সাথে যত্নশীল! আমি আজ সকালে আমার মাথা আঁচড়ান কারণ আমি ঠিক তাই করছিলাম এবং আমার কিছু সময় এখন এক ঘন্টার মধ্যেই বন্ধ হয়ে যায়। আমার সন্দেহজনক বিষয় হ'ল ডিএসটি জড়িত থাকার সময় নামযুক্ত টাইমজোন ব্যবহার করা আরও সঠিক accurate আপনি যদি আমেরিকা / নিউ_ইয়র্ক ব্যবহার করেন তবে মাইএসকিউএল ডিএসটি সম্পর্কে জানে এবং তারিখগুলি যথাযথভাবে সংরক্ষণ করবে। আপনি যদি এখানে ঠিক যেমন -04: 00 তে সেট করেন তবে এটি ডিএসটি গণনা বিবেচনায় নেবে না।
নাথানব

1
মাইএসকিএল ডিএসটি সম্পর্কে সঠিকভাবে জানে কিনা তা পরীক্ষা করে দেখুন, ডিএসটি নিয়মগুলি নিয়মিত আপডেট হয় এবং সম্পর্কিত মাইএসকিএল টেবিলগুলিতেও আপডেটের প্রয়োজন হয় (আমার উত্তরের নীচে উপরে দেখুন)
টিমো হুভিনেন

1

উপকারিতা এবং মতামতগুলি অনেকটা অভিন্ন I এটি আপনি এটি চান কিনা তা নির্ভর করে।

সতর্কতা অবলম্বন করুন, যদি মাইএসকিউএল টাইমজোনটি আপনার সিস্টেমের সময়ের থেকে পৃথক হয় (উদাহরণস্বরূপ পিএইচপি), সময়ের সাথে তুলনা করা বা ব্যবহারকারীর সাথে মুদ্রণ কিছু ঝুঁকির সাথে জড়িত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.