2011-05-18 120 views
3

是否有任何方法將MySQL發出的關於無效日期時間的警告轉換爲硬錯誤?我試過使用SET sql_mode='TRADITIONAL';這顯然是應該把(一些)警告變成錯誤的東西,但它在這裏沒有任何效果。這是MySQL 5.1.56。在會話級別上工作的東西是理想的,但我會盡我所能。將MySQL警告轉換爲錯誤

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

對於SET sql_mode='TRADITIONAL',使用無效日期進行INSERT會導致錯誤,但是使用無效日期執行SELECT仍會導致警告。您可以通過先(可能無效)日期值傳遞給該查詢觸發錯誤:

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

其中「富」是你要驗證的日期值。

1

誰應該看到錯誤?

如果這是一個固定字符串'foo',只需將'foo'轉換爲日期並查看是否可以得到有效結果(即不是00-00-000)。做一個預查詢來檢查日期的有效性,然後繼續。

在這種情況下,我還沒有能夠讓MySQL給出一個錯誤(甚至將無效日期轉換爲NULL - 它堅持使它成爲00-00-0000)。