Поиск

Решение "проблемы 2000 года

В сервере 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 года", а ответствен­ность за корректный ввод ложится на приложения.