Wygląda na to, że krótka odpowiedź na to pytanie brzmi:„Nie, to nie jest bezpieczne” – taki wniosek wynika z serii eksperymentów z powłoką MySQL. Wciąż jednak doceniłbym bardziej „teoretyczną” odpowiedź...
Najwyraźniej silnik MySQL jest (domyślnie) dość liberalny w tym, co akceptuje jako literał daty i godziny, nawet z sql_mode
ustaw na STRICT_ALL_TABLES :akceptowane są nie tylko różne separatory, ale mogą się one również różnić:
INSERT INTO t(dt) VALUES('2012-01,03.04:[email protected]'); -- Query OK, 1 row affected
Poza tym, jeśli ciąg jest za krótki, zostanie uzupełniony zerami... ale mogą być niespodzianki:
INSERT INTO t(dt) VALUES('2012011'); -- 2020-12-01 01:00:00 is what's inserted
Smutną rzeczą jest to, że zbyt długi łańcuch (gdy po ostatniej parsowalnej cyfrze następuje coś innego niż spacja) zostanie uznany za nieprawidłową wartość w trybie ścisłym:
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
ERROR 1292 (22007): Incorrect datetime value: '2012-06-27T05:25Z' for column 'dt' at row 1
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25');
Query OK, 1 row affected (0.10 sec)
W trybie tradycyjnym parsowanie jest jeszcze bardziej zrelaksowane - ale nie bardziej precyzyjne; poza tym ciągi, które są uważane za nieprawidłowe w trybie ścisłym, dadzą rodzaj „cichych ostrzeżeń”, chociaż operacje zakończą się sukcesem:
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
Query OK, 1 row affected, 1 warning (0.10 sec)
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'dt' at row 1 |
+---------+------+---------------------------------------------+
mysql> SELECT dt FROM t;
+---------------------+
| dt |
+---------------------+
| 2012-06-27 05:25:00 |
+---------------------+
Najważniejsze jest to, że musieliśmy przepisać trochę kodu związanego z DAL, aby daty (i daty i godziny) były zawsze wysyłane do bazy danych w „znormalizowanej” formie. Zastanawiam się, dlaczego to my musimy to robić, a nie programiści Zend_Db. Ale to chyba inna historia. )