En fait, vous pouvez stocker les dates inférieures à l'an 1000 dans MySQL malgré même la documentation clarification :
mysql> describe test; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | birth | date | YES | | NULL | | +-------+---------+------+-----+---------+-------+
-vous devez toujours saisir l'année au format AAAA :
mysql> insert into test values (1, '0995-03-05'); Query OK, 1 row affected (0.02 sec) mysql> select * from test; +------+------------+ | id | birth | +------+------------+ | 1 | 0995-03-05 | +------+------------+ 1 row in set (0.00 sec)
-et vous pourrez opérer avec cela comme date :
mysql> select birth + interval 5 day from test; +------------------------+ | birth + interval 5 day | +------------------------+ | 0995-03-10 | +------------------------+ 1 row in set (0.03 sec)
Quant à la sécurité. Je n'ai jamais été confronté à un cas où cela ne fonctionnerait pas dans MySQL 5.x (cela, bien sûr, ne signifie pas que cela fonctionnera à 100 %, mais au moins c'est fiable avec une certaine probabilité)
À propos des dates de la Colombie-Britannique (en dessous de Christ). Je pense que c'est simple - dans MySQL, il n'y a aucun moyen pour stocker également les dates négatives. C'est à dire. vous devrez stocker l'année séparément sous la forme d'un champ entier signé :
mysql> select '0001-05-04' - interval 1 year as above_bc, '0001-05-04' - interval 2 year as below_bc; +------------+----------+ | above_bc | below_bc | +------------+----------+ | 0000-05-04 | NULL | +------------+----------+ 1 row in set, 1 warning (0.00 sec) mysql> show warnings; +---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1441 | Datetime function: datetime field overflow | +---------+------+--------------------------------------------+ 1 row in set (0.00 sec)
Mais je pense que, dans tous les cas (au-dessous/au-dessus de l'année 0), il est préférable de stocker les parties de date sous forme d'entiers dans ce cas - cela ne dépendra pas d'une fonctionnalité non documentée. Cependant, vous devrez opérer avec ces 3 champs et non comme les dates (donc, dans un certain sens, ce n'est pas une solution à votre problème)