পিএইচপি এবং মাইএসকিউএল: বছর 2038 বাগ: এটি কী? কীভাবে সমাধান করবেন?


116

আমি তারিখ + সময় সঞ্চয় করার জন্য TIMESTAMP ব্যবহার করার কথা ভাবছিলাম, তবে আমি পড়েছিলাম যে এতে 2038 সালের সীমাবদ্ধতা রয়েছে। আমার প্রশ্নটি প্রচুর পরিমাণে জিজ্ঞাসা করার পরিবর্তে, আমি এটিকে ছোট ছোট ভাগে বিভক্ত করা পছন্দ করি যাতে নবাগত ব্যবহারকারীদের পক্ষে এটিও বোঝা সহজ। সুতরাং আমার প্রশ্ন (গুলি):

  1. ২০৩৮ সালের সমস্যাটি আসলে কী?
  2. কেন এটি ঘটে এবং যখন ঘটে তখন কী ঘটে?
  3. আমরা কীভাবে এটি সমাধান করব?
  4. এটি ব্যবহারের জন্য কি কোনও সম্ভাব্য বিকল্প রয়েছে, যা অনুরূপ সমস্যা সৃষ্টি করে না?
  5. সত্যই ঘটে যাওয়া তথাকথিত সমস্যাটি এড়াতে আমরা বিদ্যমান অ্যাপ্লিকেশনগুলি যা টাইমস্ট্যাম্প ব্যবহার করে তাদের কী করতে পারি?

আগাম ধন্যবাদ.


1
এখনও 28 বছর বাকি। আপনি কি এখনও 1982 সাল থেকে কম্পিউটার সম্পর্কিত কোনও প্রযুক্তি ব্যবহার করছেন? অসম্ভাব্য। সুতরাং চিন্তা করবেন না, কারণ 2038 সালের মধ্যে সম্ভবত এটি আর কোনও সমস্যা হবে না।
গর্ডন

24
গর্ডন, আমি একটি অ্যাপ্লিকেশন তৈরি করি যা পূর্বাভাস দেয়। আমি প্রতি মাসে আমার কত টাকা আছে তা সঞ্চয় করি এবং তারপরে আমি কখন কোটিপতি হব তা অনুমান করতে পারি। আমার ক্ষেত্রে, ২৮ বছর ততটা বেশি নয় এবং আমি নিশ্চিত যে এই মুহুর্তে আমিই একমাত্র এই সমস্যাটি পাই না (টাইমস্ট্যাম্পের প্রতিনিধিত্ব করতে আমি 64৪-বিট সংখ্যা ব্যবহার করে এটি সমাধান করেছি)।
এমিল ভিক্রাস্টম

2
এমিল এখনই bit৪ বিট পূর্ণসংখ্যা ব্যবহার করে আপনি নিজেকে একটি কংক্রিট সমস্যার সহজ সমাধান খুঁজে পেয়েছেন। সবার জন্য প্রযোজ্য নয় (বা প্রয়োজনীয়), তবে আপনার ইউসকেসের জন্য কাজ করছেন। পয়েন্টটি হ'ল, যদি ওপিতে পূর্বাভাসের মতো কোনও কংক্রিট সমস্যা না থাকে তবে এটি একটি আকর্ষণীয় বিষয় হতে পারে তবে তাঁর কিছু ভাবনা করা উচিত নয়, কারণ সাধারণ স্তরে এটি সমাধান করা কোনও পিএইচপি (ট্যাগটিকে মনে রাখবেন) বিষয় নয়। শুধু আমার 2 সি।
গর্ডন

1
2038 এর মধ্যে "YYYY-MM-DD HH: MM: SS :mmmm ..." স্ট্রিংটি পার্সিং করা আপনি যে স্বপ্নের মধ্যে দেখতে পারেন তার মধ্যে সস্তারতম অপারেশন হবে। 2038 এর মধ্যে, 32 বিট অচল হয়ে যাবে। আমি ইউনিক্স টাইমস্ট্যাম্পটিকে সন্দেহ করি যেহেতু আমরা জানি এটি তখনই বিদ্যমান থাকবে এবং যদি এটি হয় তবে আমাদের 256 বিট সিস্টেমগুলি তারিখগুলি পরিচালনা করবে যা বয়স 4096 বিট সিস্টেমকে সুখী খাবারে দেওয়া হয় beyond
সুপার ক্যাট

8
গর্ডন, এর 9 বছর পরে এখন। TIMESTAMPS এখনও ব্যবহৃত হয়। আমরা আজও ২৮ বছর আগের প্রযুক্তি ব্যবহার করি। একে ওয়ার্ল্ড ওয়াইড ওয়েব বলে।
sfscs

উত্তর:


149

আমি এটি একটি সম্প্রদায় উইকি হিসাবে চিহ্নিত করেছি তাই আপনার অবসর সময়ে বিনা দ্বিধায় সম্পাদনা করুন।

২০৩৮ সালের সমস্যাটি আসলে কী?

"বছর 2038 সমস্যা (ওয়াই 2 কে সমস্যার সাথে সাদৃশ্য হিসাবে ইউনিক্স মিলেনিয়াম বাগ, ওয়াই 2 কে 38 নামে পরিচিত) 2038 এর আগে বা আগে কিছু কম্পিউটার সফ্টওয়্যার ব্যর্থ হতে পারে The সমস্যাটি এমন সমস্ত সফ্টওয়্যার এবং সিস্টেমগুলিকে প্রভাবিত করে যা সিস্টেম সময়কে স্বাক্ষরিত 32 হিসাবে প্রভাবিত করে বিট পূর্ণসংখ্যা, এবং এই সংখ্যাটি 1 জানুয়ারী, 1970 এর সময় 00:00:00 ইউটিসি থেকে সেকেন্ডের সংখ্যা হিসাবে ব্যাখ্যা করুন ""


কেন এটি ঘটে এবং যখন ঘটে তখন কী ঘটে?

তার পরেও টাইমস মঙ্গলবার 03:14:07 ইউটিসি, 19 জানুয়ারী 2038 'চারপাশে মোড়ানো' হবে এবং এই কারণে একটি ঋণাত্মক সংখ্যা, যা এই সিস্টেমের বরং 2038. তুলনায় ডিসেম্বর 13, 1901 সালে একটি সময় হিসাবে ব্যাখ্যা করবে অভ্যন্তরীণভাবে সংরক্ষণ করা সত্য যে UNIX পর্বের পর থেকে (সেকেন্ডের সংখ্যা 1 জানুয়ারি 1970 00:00:00 GMT) 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার জন্য কম্পিউটারের সর্বাধিক মান অতিক্রম করবে।


আমরা কীভাবে এটি সমাধান করব?

  • দীর্ঘ ডেটা ধরণের ব্যবহার করুন (b৪ বিট যথেষ্ট)
  • মাইএসকিউএল (বা মারিয়াডিবি) এর জন্য, যদি আপনার সময় প্রয়োজন না হয় তবে DATEকলামের ধরণটি ব্যবহার করে বিবেচনা করুন । আপনার যদি উচ্চতর নির্ভুলতার প্রয়োজন হয় তবে তার DATETIMEপরিবর্তে ব্যবহার করুন TIMESTAMP। সাবধান হোন যে DATETIMEকলামগুলি সময় অঞ্চল সম্পর্কে তথ্য সঞ্চয় না করে, তাই আপনার অ্যাপ্লিকেশনটি জানতে হবে কোন টাইমজোনটি ব্যবহৃত হয়েছিল।
  • উইকিপিডিয়ায় বর্ণিত অন্যান্য সম্ভাব্য সমাধান
  • এক দশক আগে রিপোর্ট হওয়া এই বাগটি ঠিক করতে মাইএসকিউএল ডিভাসের জন্য অপেক্ষা করুন ।

এটি ব্যবহারের জন্য কি কোনও সম্ভাব্য বিকল্প রয়েছে, যা অনুরূপ সমস্যা সৃষ্টি করে না?

ডাটাবেসগুলিতে তারিখগুলি সংরক্ষণের জন্য বড় ধরণের ব্যবহারের জন্য যেখানেই সম্ভব চেষ্টা করুন: -৪-বিট যথেষ্ট - জিএনইউ সি এবং পসিক্স / এসওএস, বা sprintf('%u'...)পিএইচপি বা বিসিএমথ এক্সটেনশনে একটি দীর্ঘ দীর্ঘ টাইপ ।


2038-এ আমরা এখনও না হলেও কিছু ব্যবহারের সম্ভাব্য পরিস্থিতি কী?

সুতরাং একটি মাইএসকিউএল DATETIME এ 1000-9999 একটি সীমার আছে, কিন্তু TIMESTAMP এ শুধুমাত্র 1970-2038 একটি সীমার হয়েছে। যদি আপনার সিস্টেমের জন্ম তারিখ, ভবিষ্যতের আগাম তারিখগুলি (যেমন 30 বছরের বন্ধক), বা অনুরূপ, আপনি ইতিমধ্যে এই বাগটিতে চালাবেন run আবার, যদি সমস্যা হতে চলেছে তবে টাইমস্ট্যাম্প ব্যবহার করবেন না।


সত্যই ঘটে যাওয়া তথাকথিত সমস্যাটি এড়াতে আমরা বিদ্যমান অ্যাপ্লিকেশনগুলি যা টাইমস্ট্যাম্প ব্যবহার করে তাদের কী করতে পারি?

কিছু পিএইচপি অ্যাপ্লিকেশনগুলি এখনও 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`

সম্পদ


2
অসাধারণ. আমার কাছে আপনার উত্তরটি সবচেয়ে সম্পূর্ণ। অনেক ধন্যবাদ.
দেবনার

7
মাইএসকিউএলে, ভবিষ্যতের সংস্করণটি যদি TIMESTAMP এর অন্তর্নিহিত স্টোরেজ ডেটা টাইপটিকে -৪-বিটে পরিবর্তন করে, তবে আপনার কোডটি DATETIME এ পরিবর্তন করার দরকার নেই, তাই না? আমি শুধু মনে করি না যে কাউকে টাইমস্ট্যাম্প ব্যবহার করা থেকে নিরুৎসাহিত করা সঠিক জিনিস কারণ এটি ডেটা টাইপটির উদ্দেশ্য রয়েছে have
পিক্সেলফ্রেক

1
মাইএসকিউএল এর স্বাক্ষরিত বিগিন্ট ফিল্ডটি দেখে মনে হচ্ছে এটি টাইমস্ট্যাম্পগুলি সংরক্ষণ করার জন্য দুর্দান্ত কাজ করবে এবং আমি মাইএসকিউএল 5.5-তে কিছু স্থানীয় পরীক্ষা করেছি যা এটির কাজটি নিশ্চিত করে। স্পষ্টত স্বাক্ষরযুক্ত স্বাক্ষর করা ব্যবহার করা স্বাক্ষরবিহীন চেয়ে ভাল হবে কারণ আপনি অতীতের তারিখগুলিও উপস্থাপন করতে পারেন। টাইমস্ট্যাম্পগুলির জন্য BIGINT ব্যবহার না করার কোনও কারণ?
zuallauz

একটি বিষয় লক্ষণীয়, মাইএসকিউএল কেবল টাইমস্ট্যাম্প ক্ষেত্রের জন্য বর্তমান তারিখ / সময় (CURRENT_TIMESTAMP) এ স্বয়ংক্রিয় সেটিং রয়েছে। আশা করি, এই কার্যকারিতাটি শেষ পর্যন্ত সমস্ত তারিখের ধরণে পোর্ট করবে।
রায়

5
এটা একেবারেই অযৌক্তিক যে মাইএসকিউএল (এবং মারিয়াডিবি) bit৪ বিট সিস্টেমে টাইমস্ট্যাম্পগুলি সঞ্চয় করতে bit৪ বিট ইন্টিজার ব্যবহার করে না। DATETIME এ ব্যবহার করা হয় না পর্যাপ্ত সমাধান কারণ আমরা সময় অঞ্চল সম্পর্কে কোন ধারণা আছে। এটি 2005 সালে ফিরে রিপোর্ট করা হয়েছিল , তবে এখনও কোনও স্থিরতা পাওয়া যায় না।
মাইক

14

তারিখগুলি সংরক্ষণ করার জন্য ইউনিক্স টাইমস্ট্যাম্পগুলি ব্যবহার করার সময়, আপনি আসলে একটি 32 বিট পূর্ণসংখ্যা ব্যবহার করছেন, যা 1970-01-01 সাল থেকে সেকেন্ডের সংখ্যা গণনা করে; দেখতে ইউনিক্স সময়

সেই 32 বিট সংখ্যা 2038 সালে উপচে পড়বে That's এটিই 2038 সমস্যা।


যে সমস্যা সমাধানের জন্য, আপনি একটি 32 বিট আপনার তারিখগুলির সঞ্চয় করতে ইউনিক্স টাইমস্ট্যাম্প ব্যবহার করা উচিত নয় - যা মানে, যখন মাইএসকিউএল ব্যবহার করার মাধ্যমে আপনি ব্যবহার করা উচিত নয় TIMESTAMP, কিন্তু DATETIME(দেখুন 10.3.1 DATETIME এ, DATE এবং টাইমস্ট্যাম্প ধরন। ):

DATETIMEটাইপ ব্যবহৃত যখন আপনি মান উভয় তারিখ এবং সময় তথ্য প্রয়োজন হয়। সমর্থিত পরিসর '1000-01-01 00:00:00'থেকে '9999-12-31 23:59:59'

TIMESTAMPডাটা টাইপ একটি পরিসীমা আছে '1970-01-01 00:00:01'করার ইউটিসি '2038-01-19 03:14:07'ইউটিসি।


(সম্ভবত) ভাল জিনিস আপনি এড়াতে / ফিক্স আপনার আবেদন যে সমস্যা ব্যবহার করবেন হয় করতে পারি TIMESTAMP, কিন্তু DATETIMEকলাম তারিখ যে 1970 এবং 2038 মধ্যে নয় ধারণ আছে জন্য।

একটি ছোট নোট, যদিও: খুব সম্ভবত একটি সম্ভবত আছে (পরিসংখ্যানগতভাবে বলতে) যে আপনার অ্যাপ্লিকেশনটি 2038 এর আগে বেশ কয়েকবার পুনরায় লেখা হবে ^^ সুতরাং, যদি আপনাকে ভবিষ্যতে তারিখগুলি না নিয়ে কাজ করতে না হয় , আপনার অ্যাপ্লিকেশনটির বর্তমান সংস্করণে আপনাকে সেই সমস্যার যত্ন নিতে হবে না ...


1
তথ্যের জন্য +1 এখানে চেষ্টাটি হ'ল শুরু থেকেই সেরা অনুশীলনগুলিকে মানিয়ে নেওয়া, যাতে কারওর পরে সমস্যা সম্পর্কে চিন্তা করতে না হয়। তবে আপাতত 2038 এ সমস্যার মতো শব্দ নাও লাগতে পারে, তবে আমি কেবল প্রথম থেকেই আমার তৈরি প্রতিটি এবং প্রতিটি প্রয়োগের জন্য সেরা অভ্যাসগুলি অনুসরণ করতে এবং এটি অনুসরণ করতে চাই। আশা করি তা বোধগম্য হয়।
দেবনার

হ্যাঁ, এটি বোধগম্য হয়, আমি আপনার বক্তব্যটি দেখছি। তবে "সর্বোত্তম অনুশীলন" এর অর্থ "কীসের প্রয়োজনের জবাব দেয়" - আপনি যদি জানেন যে একটি টাইমস্ট্যাম্প যথেষ্ট হবে, তবে ডেটটাইম ব্যবহার করার দরকার নেই (উদাহরণস্বরূপ, যাদের সংরক্ষণের জন্য আরও মেমরির প্রয়োজন আছে; এবং এটি যদি গুরুত্বপূর্ণ হয় তবে আপনার লক্ষ লক্ষ রেকর্ড রয়েছে) ;; আমার কিছু অ্যাপ্লিকেশন রয়েছে যাতে আমি কিছু কলামগুলির জন্য টাইমস্ট্যাম্প ব্যবহার করি (উদাহরণস্বরূপ কলামগুলি বর্তমান তারিখ ধারণ করে), এবং অন্য কারও জন্য ডেটটাইম (উদাহরণস্বরূপ কলামগুলি অতীতে / ভবিষ্যতের তারিখগুলি ধারণ করে)
পাস্কাল মার্টিন

আমি দেখতে পাচ্ছি আপনার পদ্ধতিটিও বোধগম্য হয় এবং বিশেষত স্টোরেজ স্পেসের ক্ষেত্রেও ভাল কাজ করে। যদি এটি ঠিক থাকে তবে আমি কি আপনাকে জিজ্ঞাসা করতে পারি যে আপনি আপনার অ্যাপ্লিকেশনগুলিতে টাইমস্ট্যাম্প কলামের জন্য সাধারণত কোন কাঠামো এবং দৈর্ঘ্যটি ব্যবহার করেন? ধন্যবাদ।
দেবনার

ঠিক আছে, যখন আমি একটি টাইমস্ট্যাম্পটি ব্যবহার করতে চাই তখন এটি / কারণ আমার "তারিখ / সময়" ডেটা 1970 এবং 2038 এর মধ্যে ফিট করে - এবং তাই আমি মাইএসকিউএল টাইমস্ট্যাম্প ডেটা টাইপ ব্যবহার করি।
পাস্কাল মার্টিন

তথ্যের জন্য ধন্যবাদ। আপনার প্রতিক্রিয়া থেকে, আমি বুঝতে পারি যে এটি কলামটি কেবলমাত্র টাইমস্ট্যাম্প হিসাবে ঘোষণা করার পক্ষে যথেষ্ট এবং আমাদের এটির জন্য কোনও দৈর্ঘ্য সরবরাহ করার দরকার নেই (যেখানে আমরা দৈর্ঘ্য সরবরাহ করি না তার বিপরীতে এবং ইনট বা ভার,)। আমি কি সঠিক?
ডেভনার

7

গুগলে একটি দ্রুত অনুসন্ধান কৌশলটি করবে: বছর 2038 সমস্যা

  1. 2038 বছর (Y2K সমস্যার সাথে সাদৃশ্য অনুসারে ইউনিক্স মিলেনিয়াম বাগ, ওয়াই 2 কে 38 নামে পরিচিত) 2038 এর আগে বা বছরের কিছু কম্পিউটার সফ্টওয়্যার ব্যর্থ হতে পারে
  2. সমস্যাটি এমন সমস্ত সফ্টওয়্যার এবং সিস্টেমগুলিকে প্রভাবিত করে যা সিস্টেম সময়কে একটি স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার হিসাবে সংরক্ষণ করে এবং 1 জানুয়ারী, 1970 টি ইউটিসি-র সময় 00:00:00 ইউটিসি থেকে এই সংখ্যাটিকে সেকেন্ডের সংখ্যা হিসাবে ব্যাখ্যা করে The সর্বশেষ সময় যা এইভাবে উপস্থাপিত হতে পারে মঙ্গলবার, 19 জানুয়ারী 2038- এ ইউটিসি 03:14:07 এই মুহূর্তের বাইরে সময়গুলি "চারপাশে মোড়ানো" হবে এবং অভ্যন্তরীণভাবে একটি নেতিবাচক সংখ্যা হিসাবে সংরক্ষণ করা হবে, যা এই সিস্টেমগুলি ১৯০১ সালে ২০৩০ এর পরিবর্তে তারিখ হিসাবে ব্যাখ্যা করবে
  3. বিদ্যমান সিপিইউ / ওএস সংমিশ্রণগুলি, বিদ্যমান ফাইল সিস্টেমগুলি বা বিদ্যমান বাইনারি ডেটা ফর্ম্যাটগুলির জন্য এই সমস্যার পক্ষে সহজ কোনও সমাধান নেই

2

http://en.wikipedia.org/wiki/Year_2038_problem বেশিরভাগ বিবরণ রয়েছে

সংক্ষেপে:

1) + 2) সমস্যাটি হ'ল অনেকগুলি সিস্টেমের তারিখের তথ্যটি 1/1/1970 সাল থেকে সেকেন্ডের সংখ্যার সমান 32-বিট স্বাক্ষরিত int হিসাবে সঞ্চয় করে। সর্বশেষতম তারিখ যা এইভাবে সঞ্চিত হতে পারে মঙ্গলবার, 19 জানুয়ারী 2038-এ ইউটিসি 03:14:07 ইউটিসি this ঠিক তখনই কী ঘটবে, সিস্টেম থেকে অন্য সিস্টেমে পরিবর্তিত হয় তবে এগুলি সম্ভবত তাদের কারও পক্ষে ভাল হবে না বলাই যথেষ্ট!

যে সমস্ত সিস্টেমে কেবল অতীতে তারিখগুলি সংরক্ষণ করা হয়, তারপরে আমি অনুমান করি যে আপনাকে কিছুক্ষণ চিন্তা করার দরকার নেই! মূল সমস্যাটি এমন সিস্টেমে যা ভবিষ্যতে তারিখগুলি নিয়ে কাজ করে। আপনার সিস্টেমে যদি ভবিষ্যতে ২৮ বছর তারিখ নিয়ে কাজ করা দরকার হয় তবে আপনার এখনই উদ্বেগ শুরু করা উচিত!

3) উপলভ্য বিকল্প তারিখের একটি বিন্যাস ব্যবহার করুন বা একটি -৪-বিট সিস্টেমে যান এবং 64৪-বিট ইনট ব্যবহার করুন। অথবা ডাটাবেসের জন্য বিকল্প সময় স্ট্যাম্প ফর্ম্যাট ব্যবহার করুন (যেমন মাইএসকিউএল DATETIME ব্যবহারের জন্য)

4) দেখুন 3!

5) দেখুন 4 !!! ;)


আপনার পয়েন্ট 4 এবং 5 আমাকে 'বাই বাই রেফারেন্স' মনে করিয়ে দেয়। যা আমার মুখে হাসি দিল। একই জন্য ধন্যবাদ এবং +1।
ডেভনার

1

ব্রস, টাইমস্ট্যাম্পগুলি প্রদর্শন করতে যদি আপনার পিএইচপি ব্যবহার করতে হয় তবে এটি ইউনিক্স টাইমস্ট্যাম্প ফর্ম্যাট থেকে পরিবর্তন না করেই সেরা পিএইচপি সমাধান।

একটি কাস্টম_ডেট () ফাংশন ব্যবহার করুন। এর ভিতরে, ডেটটাইম ব্যবহার করুন। এখানে ডেটটাইম সমাধান

ডাটাবেসে আপনার টাইমস্ট্যাম্প হিসাবে যতক্ষণ না আপনি UNSIGNED BIGINT (8) রাখবেন। যতক্ষণ আপনার পিএইচপি 5.2.0 ++ থাকে


-1

যেহেতু আমি কোনও আপগ্রেড করতে চাই না, আমি আমার ব্যাকএন্ড (এমএসএসকিউএল) কে পিএইচপি পরিবর্তে এই কাজটি করতে বলি!

$qry = "select DATEADD(month, 1, :date) next_date ";
$rs_tmp = $pdo->prepare($qry);
$rs_tmp->bindValue(":date", '2038/01/15');
$rs_tmp->execute();
$row_tmp = $rs_tmp->fetch(PDO::FETCH_ASSOC);

echo $row_tmp['next_date'];

একটি কার্যকর উপায় নাও হতে পারে, তবে এটি কার্যকর হয়।

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