【发布时间】:2014-11-05 09:51:21
【问题描述】:
MySQL 版本:5.5.38-0ubuntu0.14.04.1
表结构:
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?
上面的错误可以通过将dist转换为SIGNED来解决:
SELECT * FROM route_points2 WHERE -1*CAST(dist AS SIGNED) < 1;
这很好用。
但是我不明白mysql为什么选择BIGINT UNSIGNED代替-1*dist
【问题讨论】:
-
你可以避免
CAST使用类似的东西:SELECT * FROM `route_points2` WHERE -`dist` < 1; -
这是一个简化的例子。在现实世界中,它不仅仅是符号反转。