2014-09-11 28 views
0

MySQL版本:5.5.38-0ubuntu0.14.04.1ERROR 1690(22003):BIGINT UNSIGNED值超出範圍在

表結構:

CREATE TABLE `route_points2` (
`dist` tinyint(4) unsigned NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

內容:1行與dist等於至200

SQL:

SELECT * FROM route_points2 WHERE -1*dist < 1; 

錯誤:

ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(<cache>(-(1)) * `db_name`.`route_points2`.`dist`)' 

爲什麼mysql將-1*dist轉換爲BIGINT UNSIGNED

上述錯誤可以通過鑄造distSIGNED解決:

SELECT * FROM route_points2 WHERE -1*CAST(dist AS SIGNED) < 1; 

這工作得很好。

但我不明白爲什麼MySQL的選擇BIGINT UNSIGNED-1*dist

+0

可避免類似的'CAST':'''SELECT * FROM'route_points2' WHERE -'dist' <1;''' – wchiquito 2014-09-11 14:12:20

+0

它簡化例子。在現實世界中,它不僅是符號反轉。 – Index 2014-09-11 18:44:59

+0

像https://stackoverflow.com/questions/5605085/bigint-unsigned-value-is-out-of-range – qdinar 2017-07-13 09:35:57

回答

0

由於您使用的是無符號數,並與有符號數(-1)一對比,MySQL需要投下您未簽名的簽名。我猜它選擇了BIGINT來應對所有可能的INT。

行爲與MySQL 5.5改變了,看看這個http://dev.mysql.com/doc/refman/5.5/en/out-of-range-and-overflow.html

爲了使這項工作,定義表:

CREATE TABLE `route_points2` (
`dist` tinyint NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

,或者如果您需要值> 127使用:

CREATE TABLE `route_points2` (
`dist` smallint NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
0

的MySQL默認情況下不(再)生產的無符號運算數的減法簽署的結果,既不從混合符號性倍增。

您必須啓用the MySQL mode MODE_NO_UNSIGNED_SUBTRACTION恢復舊的(相當合理)默認減法行爲。似乎並不存在乘法的並行升級模式。

正如您已經發布的,解決方案是使用CAST運算符兩個減法的操作數以及潛在混合乘法中的任何無符號操作數。

旁白:不要緊東西寬約的類型。在我第一次遇到時,我認爲它只會影響BIGINT操作數。由於沒有更廣泛的符號類型去,和大的值不能正確地表示,我會明白在這種情況下,錯誤狀態,但正如你所看到的,這個錯誤發生一路下跌的最小整數類型(例如值從TINYINT UNSIGNED列中拉出)。