檢查5.1.7 Server SQL Modes。
mysql> SELECT @@GLOBAL.SQL_MODE, @@SESSION.SQL_MODE;
+--------------------------------------------+--------------------------------------------+
| @@GLOBAL.SQL_MODE | @@SESSION.SQL_MODE |
+--------------------------------------------+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+--------------------------------------------+
1 row in set (0.00 sec)
mysql> DELIMITER //
mysql> DROP PROCEDURE IF EXISTS `sp_test`//
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE PROCEDURE `sp_test`(IN `page` INT)
-> BEGIN
-> SELECT `page`;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `sp_test`(2147483647);
+------------+
| `page` |
+------------+
| 2147483647 |
+------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> CALL `sp_test`(2147483648);
ERROR 1264 (22003): Out of range value for column 'page' at row 1
mysql> SET @@SESSION.SQL_MODE = 'NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@GLOBAL.SQL_MODE, @@SESSION.SQL_MODE;
+--------------------------------------------+------------------------+
| @@GLOBAL.SQL_MODE | @@SESSION.SQL_MODE |
+--------------------------------------------+------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+------------------------+
1 row in set (0.00 sec)
mysql> CALL `sp_test`(2147483648);
+------------+
| `page` |
+------------+
| 2147483647 |
+------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------+
| Warning | 1264 | Out of range value for column 'page' at row 1 |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)
列錯誤消息超出範圍表示問題出現在列而不是頁面參數。我誠實地認爲,在這種情況下的錯誤消息告訴你到底是什麼問題:你正試圖將一個值插入到字段數據類型的允許範圍之外的字段。您可能在產生錯誤的服務器中啓用嚴格的sql模式。老實說,啓用嚴格的sql模式確實有意義,我寧願應用一些輸入檢查而不是依靠mysql來截斷數據。 – Shadow
不,我只是試圖創建空的SP(類似於下面的答案),並且失敗的同一個錯誤。看起來STRICT_TRANS_TABLES不僅控制表格列,而且還控制SP輸入參數和變量值,因爲如果乘積結果> 2147483647 – daymansiege
STRICT_TRANS_TABLES指示嚴格的sql模式,則'page = page * size'也會失敗。如果你在mysql strct sql模式下搜索,那麼你會發現什麼是嚴格的sql模式的描述。再說一遍:我認爲禁用嚴格的sql模式並不是一個好習慣。實施正確的輸入檢查應該是未來的方向。您的代碼應儘可能獨立於mysql配置。 – Shadow