将MySQL警告转换为错误

时间:2011-05-18 21:20:49

标签: mysql sql database

有没有办法将MySQL发出的关于无效日期时间的警告转换为硬错误?我已经尝试使用SET sql_mode='TRADITIONAL';显然应该将(某些)警告的内容变成错误,但这里没有任何影响。这是MySQL 5.1.56。在会话级别工作的东西是理想的,但我会采取我能得到的东西。

mysql> describe test_table2;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| value    | int(11)     | YES  |     | NULL    |       |
| name     | varchar(16) | YES  |     | NULL    |       |
| sometime | datetime    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from test_table2;
+-------+-------+---------------------+
| value | name  | sometime            |
+-------+-------+---------------------+
|     1 | one   | 2002-09-01 10:00:00 |
|     2 | two   | 2002-09-02 11:00:00 |
|     3 | three | 2002-09-03 12:00:00 |
|     4 | four  | 2002-01-04 13:00:00 |
|     5 | five  | 2002-01-05 14:00:00 |
+-------+-------+---------------------+
5 rows in set (0.00 sec)

mysql> select * from test_table2 where sometime = 'foo';
Empty set, 2 warnings (0.00 sec)

Warning (Code 1292): Incorrect datetime value: 'foo' for column 'sometime' at row 1
Warning (Code 1292): Incorrect datetime value: 'foo' for column 'sometime' at row 1

2 个答案:

答案 0 :(得分:2)

使用SET sql_mode='TRADITIONAL',使用无效日期执行INSERT会导致错误,但使用无效日期执行SELECT仍会导致警告。您可以通过首先将(可能无效的)日期值传递给此查询来触发错误:

CREATE TEMPORARY TABLE IF NOT EXISTS date_guard (date DATE) SELECT 'foo' AS date;

其中'foo'是您要验证的日期值。

答案 1 :(得分:1)

谁应该看到错误?

如果这是一个固定的字符串'foo',只需尝试将'foo'转换为日期并查看是否可以获得有效结果(即不是00-00-000)。进行预查询以检查日期的有效性,然后继续。

在这种情况下,我无法让MySQL发出错误(甚至将无效日期转换为NULL - 它坚持将其设为00-00-0000)。