Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL вмъкване в DATETIME:безопасно ли е да се използва ISO::8601 формат?

Изглежда, че краткият отговор на този въпрос е "Не, не е безопасно" - това заключение следва серия от експерименти с обвивката на MySQL. Все пак бих оценил по-"теоретичен" отговор...

Очевидно MySQL двигателят е (по подразбиране) доста либерален в това, което приема като Datetime литерал дори с sql_mode зададено на STRICT_ALL_TABLES :не само се приемат различни разделители, но може и да се различават:

INSERT INTO t(dt) VALUES('2012-01,03.04:[email protected]'); -- Query OK, 1 row affected

Освен това, ако низът е твърде кратък, той ще бъде подплатен с нули... но може да има изненади:

INSERT INTO t(dt) VALUES('2012011'); -- 2020-12-01 01:00:00 is what's inserted

Тъжното е, че твърде дълъг низ (когато последната цифра за анализиране е последвана от нещо различно от интервал) ще се счита за невалидна стойност в строг режим:

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)

В традиционния режим разборът е още по-спокоен - но не и по-прецизен; освен това низовете, които се считат за неправилни в стриктния режим, ще дават нещо като „безшумни предупреждения“, въпреки че операциите ще успеят:

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 |
+---------------------+

Изводът е, че трябваше да пренапишем някакъв код, свързан с DAL, така че датите (и датите и времената) винаги да се изпращат в DB в "нормализирана" форма. Чудя се защо трябва да го направим ние, а не разработчиците на Zend_Db. Но това е друга история, предполагам. )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете връзка в MySQL Workbench

  2. Конвертирайте MySQL база данни от латински в UTF-8

  3. Достъпът е отказан за 'user'@'localhost'

  4. Библиотеката не е заредена:@rpath/libmysqlclient.21.dylib Причина:изображението не е намерено Грешка при мигриране на Django с помощта на драйвер за mysqlclient DB и MySQL 8 с macOS

  5. Грешка при опит за мигриране на postgresql db към mysql с работна маса