2011-04-21 45 views
7

我正在为我的CMS使用嵌套集,但自MySQL 5.5以来我无法移动节点。
以下错误被抛出:BIGINT自MySQL 5.5以来超出范围的错误

错误而重新排序文档错误:在MySQL-DB:无效的SQL:

SELECT baum2.id AS id, 
COUNT(*) AS level 
FROM elisabeth_tree AS baum1, 
elisabeth_tree AS baum2 
WHERE baum2.lft BETWEEN baum1.lft AND baum1.rgt 
GROUP BY baum2.lft 
ORDER BY ABS(baum2.id - 6); 

错误:BIGINT UNSIGNED值超出范围“(lektorenbaum2id。 - 6)'
error number:1690

有没有人解决过这个问题?我已经尝试过施放一些部件,但没有成功。

+0

@ user718790,欢迎来到stackoverflow。 – Johan 2011-04-21 11:07:28

回答

10

BIGINT UNSIGNED是无符号的,不能是负数。如果ID是小于6

推测早期隐式转换为符号版本

你的表达ABS(lektoren.baum2.id - 6)将使用一个负中间值。你需要做一个演员。

尝试

ORDER BY ABS(CAST(lectoren.baum2.id AS SIGNED) - 6) 
+0

是的,就是这样,谢谢! :) – user718790 2011-04-24 20:58:29

+2

根据[这里的文档](http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html#sqlmode_no_unsigned_subtraction):_默认情况下,整数操作数之间的减法产生UNSIGNED如果任何操作数为UNSIGNED,则返回结果._ – Wiseguy 2011-11-12 14:27:52

+0

升级到Mysql5.5后,我也遇到了同样的问题请参阅http://dev.mysql.com/doc/refman/5.5/en/out-of-range-and- overflow.html – Omesh 2012-08-02 10:22:31

1

ORDER BY ABS(CAST(lectoren.baum2.id AS BIGINT SIGNED) - 6)

这种变化将是MySQL只。

代替,做的是执行查询在此之前

ORDER BY ABS(- 6 + baum2.id); 
5
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; 

呼叫。