問題現象
一個直接執行可以成功(可能會報Warning)的SQL語句,在Procedure內部執行失敗並報錯。
例如:
一個UPDATE語句嘗試將一個date屬性的列值更新為空白字串:
UPDATE t1 SET start_date="" where id=2;直接執行該語句成功並報Warning:
+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------+
| Warning | 1265 | Data truncated for column 'start_date' at row 2 |
+---------+------+--------------------------------------------------------+在Procedure內部執行該語句失敗並報錯:
ERROR 1292 (22007): Incorrect date value: '' for column 'start_date' at row 2可能原因
建立Procedure時,MySQL會記錄當時的變數sql_mode的值,並儲存在系統資料表mysql.proc中。Procedure運行時使用建立時的sql_mode值而非運行時的sql_mode值,如果建立時的sql_mode值比運行時的sql_mode值限制條件更多,就會出現上述問題。
在上述案例中,建立Procedure時的sql_mode值為'STRICT_TRANS_TABLES',而運行時的sql_mode值為'','STRICT_TRANS_TABLES'的限制條件比''更多,所以出現上述問題。
解決方案
可以選擇以下兩種解決方案:
按照實際需求,重新設定sql_mode的值,然後重新建立Procedure。
按照實際需求,修改已有的Procedure在mysql.proc裡的sql_mode的值。
UPDATE mysql.proc SET sql_mode='xxx' WHERE Procedure='xxx';