1.6 Compatibilité an 2000

MySQL lui-même n'a pas de problémes avec la compatibilité An 2000 (Y2K):

  • MySQL utilise les fonctions de gestion du temps d'Unix et n'a pas de problèmes jusqu'en 2069; toutes les années sur 2-digit sont comprises entre 1970 et 2069, cela qui signifie que si vous stocker 01 dans une colonne année, MySQL le traite comme 2001.
  • Toutes les fonctions de date de MySQL sont stockées dans un fichier unique ``sql/time.cc'' et codées pour être compatible An 2000.
  • Dans la version 3.22 de MySQL et les versions ultérieures, le nouveau type de colonne Année peut stocker des années entre 0 et 1901 jusqu'à 2155 sur 1 byte et éditer sur 2 ou 4 digits.

Vous pouvez avoir des problèmes avec des applications qui utilisent MySQL mais non compatible An 2000.

Malheureusement ces problèmes sont difficilement corrigibles lorsque ces applications sont écrites par différents programmeurs et que chacun utilise ses propres conventions pour gérer les dates.

Vous trouverez ci-après une démonstration simple qui illustre le fait que MySQL n'a aucun problème avec les dates jusqu'en 2030!

mysql> DROP TABLE IF EXISTS y2k;

mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp);

mysql> INSERT INTO y2k VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959);

mysql> INSERT INTO y2k VALUES ("1999-01-01","1999-01-01 00:00:00",19990101000000);

mysql> INSERT INTO y2k VALUES ("1999-09-09","1999-09-09 23:59:59",19990909235959);

mysql> INSERT INTO y2k VALUES ("2000-01-01","2000-01-01 00:00:00",20000101000000);

mysql> INSERT INTO y2k VALUES ("2000-02-28","2000-02-28 00:00:00",20000228000000);

mysql> INSERT INTO y2k VALUES ("2000-02-29","2000-02-29 00:00:00",20000229000000);

mysql> INSERT INTO y2k VALUES ("2000-03-01","2000-03-01 00:00:00",20000301000000);

mysql> INSERT INTO y2k VALUES ("2000-12-31","2000-12-31 23:59:59",20001231235959);

mysql> INSERT INTO y2k VALUES ("2001-01-01","2001-01-01 00:00:00",20010101000000);

mysql> INSERT INTO y2k VALUES ("2004-12-31","2004-12-31 23:59:59",20041231235959);

mysql> INSERT INTO y2k VALUES ("2005-01-01","2005-01-01 00:00:00",20050101000000);

mysql> INSERT INTO y2k VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000);

mysql> INSERT INTO y2k VALUES ("2050-01-01","2050-01-01 00:00:00",20500101000000);

mysql> SELECT * FROM y2k;

+------------+---------------------+----------------+
| date       | date_time           | time_stamp     |
+------------+---------------------+----------------+
| 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 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+
13 rows in set (0.00 sec)

mysql> DROP TABLE y2k;

Cela montre que le type DATE et DATETIME sont compatibles, alors que le type TIMESTAMP, qui est utilisé pour stocker la date courante, est limitée au 2030-01-01. TIMESTAMP est compris entre 1970 et 2030 sur les machines 32-bits.

Même si MySQL est compatible An 2000, il est de votre responsabilité de fournir une entrée correcte. 7.2.6.1 Bug de l'an 2000 et données de types date pour les règles appliquées par MySQL pour la gestion des entrées ambiguës de données (Donnée contenant des valeurs sur 2-digit).