На самом деле, вы можете хранить даты ниже 1000 года в MySQL, несмотря даже documentation осветления:
mysql> describe test;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| birth | date | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
-вы еще нужно ввести год в формате YYYY:
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)
-А ты будет иметь возможность работать с этим как :
mysql> select birth + interval 5 day from test;
+------------------------+
| birth + interval 5 day |
+------------------------+
| 0995-03-10 |
+------------------------+
1 row in set (0.03 sec)
Что касается безопасности. Я никогда не сталкивался с тем случаем, когда это не будет работать в MySQL 5.x (это, по сути, не означает, что он будет работать на 100%, но, по крайней мере, он надежен с определенной вероятностью)
О датах BC (ниже Христа). Я думаю, что это просто - в MySQL есть , а не, чтобы сохранить отрицательные даты. То есть вам нужно хранить год отдельно в качестве знакового целого поля:
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)
Но я думаю, в любом случае (ниже/выше 0 года), лучше на сегодняшний день хранения частей в виде целых чисел в этом случае - это не будет полагаться к недокументированной функции. Однако вам нужно будет работать с этими 3 полями не как даты (так что в некотором смысле это не решение вашей проблемы)
В подобных случаях, вы можете рассмотреть возможность использования другой базы данных; возможно, PostgreSQL может предоставить диапазоны дат, которые вам нужны? ([docs] (http://www.postgresql.org/docs/current/static/datatype-datetime.html), по-видимому, подразумевает значительно больший диапазон дат) – Spudley
@Spudley: Oracle, DB2, Firebird don ' У меня есть это ограничение. Таким образом, есть много альтернатив. –
@a_horse_with_no_name - PostgreSQL является самым известным открытым исходным кодом после mySQL, но да, есть много вариантов. – Spudley