Я позначив це як вікі спільноти, тому сміливо редагуйте у вільний час.
Що саме є проблемою Рік 2038?
"Проблема 2038 року (також відома як Bug Unilen Millennium Bug, Y2K38 за аналогією до проблеми Y2K) може призвести до виходу з ладу деяких програмного забезпечення комп'ютера до або в 2038 році. Проблема стосується всіх програмного забезпечення та систем, які зберігають системний час як підписаний 32 -бітове ціле число і інтерпретуйте це число як кількість секунд з 00:00:00 UTC 1 січня 1970 року. "
Чому вона виникає і що відбувається, коли вона виникає?
Часи після 03:14:07 UTC у вівторок, 19 січня 2038 р., Будуть «обгортатись» і зберігатись у внутрішній формі як від’ємне число, що ці системи будуть інтерпретувати як час у 13 грудня 1901 року, а не у 2038 році. Це пов'язано з той факт, що кількість секунд після епохи UNIX (1 січня 1970 00:00:00 GMT) перевищить максимальне значення комп'ютера для 32-бітного цілого числа, підписаного.
Як ми її вирішуємо?
- Використовуйте довгі типи даних (достатньо 64 біт)
- Для MySQL (або MariaDB), якщо вам не потрібна інформація про час, розгляньте можливість використання
DATE
типу стовпця. Якщо вам потрібна більш висока точність, DATETIME
скоріше використовуйте TIMESTAMP
. Остерігайтеся, щоб DATETIME
стовпці не зберігали інформацію про часовий пояс, тому ваша програма повинна знати, який часовий пояс використовувався.
- Інші можливі рішення, описані у Вікіпедії
- Зачекайте, коли розробки MySQL виправлять цю помилку, про яку повідомлялося більше десяти років тому.
Чи існують можливі альтернативи його використанню, які не становлять подібної проблеми?
Спробуйте, де можливо, використовувати великі типи для зберігання дат у базах даних: достатньо 64-бітних - довгий довгий тип у GNU C та POSIX / SuS, або sprintf('%u'...)
в PHP або розширенні BCmath.
Назвіть кілька можливих випадків використання, хоча ми ще не в 2038 році?
Отже, DATETIME MySQL має діапазон 1000-9999, але лише TIMESTAMP має діапазон 1970-2038. Якщо у вашій системі зберігаються дати народження, майбутні дати переадресації (наприклад, 30-річна іпотека) або подібні, ви вже збираєтеся зіткнутися з цією помилкою. Знову ж таки, не використовуйте TIMESTAMP, якщо це буде проблемою.
Що ми можемо зробити з існуючими програмами, які використовують TIMESTAMP, щоб уникнути так званої проблеми, коли вона дійсно виникає?
Трохи додатків PHP все ще буде в 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`
Ресурси