この質問に対する簡単な答えは「いいえ、安全ではありません」のようです。この結論は、MySQLシェルを使用した一連の実験に続くものです。それでも、もっと「理論的な」答えをいただければ幸いです...
どうやらMySQLエンジンは、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)
従来のモードでは、解析はさらにリラックスしますが、より正確ではありません。さらに、strictモードで正しくないと見なされる文字列は、操作は成功しますが、一種の「サイレント警告」を出します。
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 |
+---------------------+
つまり、日付(および日時)が常に「正規化された」形式でDBに送信されるように、DAL関連のコードを書き直す必要がありました。 Zend_Db開発者ではなく、なぜそれをしなければならないのは私たちなのだろうか。しかし、それは別の話だと思います。 )