Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wstaw MySQL do DATETIME:czy bezpiecznie jest używać formatu ISO::8601?

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. )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Umieszczenie Railsów nad istniejącą bazą danych

  2. Jak wygenerować losowy przedział czasu i dodać go do daty i godziny mysql za pomocą php?

  3. Czy miejsce zajmowane przez usunięte wiersze jest ponownie wykorzystywane?

  4. Zalecenia dotyczące dostrajania wydajności MySQL my.cnf

  5. Laravel:Pobierz obiekt z kolekcji według atrybutów