В сервере MySQL известная «проблема 2000 года» (Y2K) полностью решена.
- В MySQL используются функции времени Unix, которые обрабатывают даты
вплоть до 2037 года как значения типа TIMESTAMP. Для значений типа date и
DATETIME допустима работа с датами вплоть до 9999 года. - Все функции времени MySQL хранятся в одном исходном файле — sql/time.cc;
они реализованы настолько тщательно, что являются безопасными в контексте
«проблемы 2000 года». - В MySQL 3.22 и последующих версиях столбцы типа YEAR могут хранить год 0 и
значения лет от 1901 до 2155 в одном байте и отображать их в виде двузначного
или четырехзначного числа. Все двузначные годы рассматриваются как принад
лежащие диапазону от 1970 до 2069; это означает, что если в столбце YEAR сохра
няется значение 01, MySQL трактует его как 2001 год.
Приведенный далее код служит простой демонстрацией того, что сервер MySQL не имеет проблем со значениями типов DATE и DATETIME вплоть до 9999 года, а со значениями типа TIMESTAMP — после 2030 года.
mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)
(Запрос успешно выполнен, затронуто 0 строк (0.01 с))
raysql> CREATE TABLE y2k (date DATE,
-> date__time DATETIME,
-> time_stamp TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO y2k VALUES
-> (‘1998-12-31′,’1998-12-31 23:59:59’,19981231235959),
-> (‘1999-01-01′,’1999-01-01 00:00:00’,19990101000000),
-> (‘1999-09-09′,’1999-09-09 23:59:59’,19990909235959),
-> (‘2000-01-01′,’2000-01-01 00:00:00’,20000101000000),
-> (‘2000-02-28′,’2000-02-28 00:00:00’,20000228000000),
-> (‘2000-02-29′,’2000-02-29 00:00:00’,20000229000000),
-> (‘2000-03-01′,’2000-03-01 00:00:00’,20000301000000),
-> (‘2000-12-31′,’2000-12-31 23:59:59’,20001231235959),
-> (‘2001-01-01′,’2001-01-01 00:00:00’,20010101000000),
-> (‘2004-12-31′,’2004-12-31 23:59:59’,20041231235959) ,
-> (‘2005-01-01′,’2005-01-01 00:00:00’,20050101000000) ,
-> (‘2030-01-01′,’2030-01-01 00:00:00’,20300101000000),
-> (‘2040-01-01′,’2040-01-01 00:00:00’,20400101000000),
-> (‘9999-12-31′,’9999-12-31 23:59:59’,99991231235959) ;
Query OK, 14 rows affected (0.01 sec) Records: 14 Duplicates: 0 Warnings: 2 (Записей: 14 Дубликатов: 0 Предупреждений: 2)
mysql> SELECT * FROM y2k;
Таким образом, сам сервер MySQL защищен от «проблемы 2000 года», а ответственность за корректный ввод ложится на приложения.