Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichert man sehr alte Daten in der Datenbank?

Tatsächlich können Sie Datumsangaben unter dem Jahr 1000 in MySQL speichern trotz sogar Dokumentation Klarstellung:

mysql> describe test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| birth | date    | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

-Sie müssen noch das Jahr im JJJJ-Format eingeben:

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)

- und Sie können damit als Datum arbeiten :

mysql> select birth + interval 5 day from test;                                                                              
+------------------------+                                                                                                   
| birth + interval 5 day |                                                                                                   
+------------------------+                                                                                                   
| 0995-03-10             |
+------------------------+
1 row in set (0.03 sec)

Was die Sicherheit angeht. Ich habe noch nie einen Fall erlebt, in dem dies in MySQL 5.x nicht funktioniert (was natürlich nicht bedeutet, dass es zu 100 % funktioniert, aber zumindest mit einer gewissen Wahrscheinlichkeit zuverlässig ist)

Über BC-Daten (unter Christus). Ich denke, das ist einfach - in MySQL gibt es keine Möglichkeit um auch negative Daten zu speichern. D.h. Sie müssen das Jahr separat als vorzeichenbehaftetes Integer-Feld speichern:

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)

Aber ich denke, in jedem Fall (unter/über dem Jahr 0) ist es in diesem Fall besser, Datumsteile als ganze Zahlen zu speichern - dies hängt nicht von undokumentierten Funktionen ab. Sie müssen jedoch mit diesen 3 Feldern nicht als Datumsangaben arbeiten (in gewisser Weise ist dies also keine Lösung für Ihr Problem)