这个问题的简短答案似乎是“不,这并不安全”-这个结论是通过对MySQL Shell进行的一系列实验得出的。不过,仍然会希望有一个更“理论上”的答案。
显然,MySQL引擎(默认情况下)在它作为Datetime文字接受的方面是相当自由的,即使将其
sql_mode设置为STRICT_ALL_TABLES:不仅接受各种分隔符,它们也可能有所不同:
INSERT INTO t(dt) VALUES('2012-01,03.04:05@06'); -- Query OK, 1 row affected此外,如果字符串太短,则会用零填充…,但可能会令人惊讶:
INSERT INTO t(dt) VALUES('2012011'); -- 2020-12-01 01:00:00 is what'sinserted可悲的是,字符串太长(当最后一个可分析的数字后跟空格以外的其他内容时)在严格模式下将被视为无效值:
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 1mysql> 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相关的代码,以便日期(和日期时间)始终以“规范化”形式发送到数据库。我想知道为什么要做的是我们,而不是Zend_Db开发人员。我想那是另一个故事。)



