2016-05-31 367 views
0

我的存儲過程具有頁面編號的IN參數(IN page INT) 對於任何值<= 2147483647,一切正常。 如果值爲> 2147483647,則會收到錯誤1264。 所有這一切都發生在5.6.26 Community Server compiled for Linux (x86_64)5.6.24 Community Server compiled for Win64 (x86_64) 和以上所有都是好的,我明白錯誤。錯誤代碼:1264.第1行列'XXX'超出範圍值

但是,在服務器5.6.30-1+deb.sury.org~xenial+2 (Ubuntu) compiled for debian-linux-gnu (x86_64)這不是轉載。無論我通過那裏的輸入值是多少,輸入值都會被截斷爲2147483647。

什麼設置負責這個「自動最大值上限」?我如何在不重新安裝的情況下同步不同環境下的設置以獲得相同的行爲?

謝謝!

+0

列錯誤消息超出範圍表示問題出現在列而不是頁面參數。我誠實地認爲,在這種情況下的錯誤消息告訴你到底是什麼問題:你正試圖將一個值插入到字段數據類型的允許範圍之外的字段。您可能在產生錯誤的服務器中啓用嚴格的sql模式。老實說,啓用嚴格的sql模式確實有意義,我寧願應用一些輸入檢查而不是依靠mysql來截斷數據。 – Shadow

+0

不,我只是試圖創建空的SP(類似於下面的答案),並且失敗的同一個錯誤。看起來STRICT_TRANS_TABLES不僅控制表格列,而且還控制SP輸入參數和變量值,因爲如果乘積結果> 2147483647 – daymansiege

+0

STRICT_TRANS_TABLES指示嚴格的sql模式,則'page = page * size'也會失敗。如果你在mysql strct sql模式下搜索,那麼你會發現什麼是嚴格的sql模式的描述。再說一遍:我認爲禁用嚴格的sql模式並不是一個好習慣。實施正確的輸入檢查應該是未來的方向。您的代碼應儘可能獨立於mysql配置。 – Shadow

回答

0

檢查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) 
+0

感謝您快速回答!我認爲。 在Windows上我有(全局和會話)'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' 在CentOS我有'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' 而在Ubuntu上我剛纔'NO_ENGINE_SUBSTITUTION' 所以'STRICT_TRANS_TABLES'似乎控制這一點。爲什麼對於同一個5.6版本,這是如此不同? :) – daymansiege

相關問題