使用group by子句和count()函数时,MySQL的行为不一致/奇怪

时间:2015-05-22 06:24:28

标签: mysql count group-by

由于MySQL中的错误(?),COUNT()函数以及GROUP BY子句可能导致MySQL泄漏数据库详细信息,如下所示 -

mysql> select count(*), floor(rand()*2)x from users group by x;
  

ERROR 1062(23000):键'group_key'重复输入'1'

这里可以通过精心设计的查询揭示敏感细节。这个 是出乎意料的行为,也许是一个错误?

mysql> select count(*), floor(rand()*2)x from users group by x;

+----------+---+  
| count(*) | x |  
+----------+---+  
| 8        | 0 |  
| 5        | 1 |  
+----------+---+ 

2 rows in set (0.00 sec)< - 有时查询运行时没有任何错误(预期行为)

有谁知道究竟是什么导致MySQL错误。

我正在使用的试验台是这个优秀的资源 - https://github.com/Audi-1/sqli-labs

1 个答案:

答案 0 :(得分:1)

这看起来是一个报告的(和旧的!)错误:http://bugs.mysql.com/bug.php?id=58081

  

描述:GROUP BY查询在某些情况下返回此错误   情况:

     

重复输入' 107374182410737418241'对于关键' group_key'

     

' group_key'不是表中的真正列名。它看起来像一个   临时表中分组列的名称。

     

如何重复:设置名称latin1;删除表如果存在t1;创建表   t1(a int)engine = myisam;插入t1值(0),(0),(1),(0),(0);   从t1,t1 t2 group中选择count(*)('',t2.a,   t1.a,(@@ global.max_binlog_size));

     

ERROR 1062(23000):重复输入' 107374182410737418241'为了钥匙   ' group_key'

注释表明建议的解决方法是增加可用的堆和临时表大小:

  

我找到的解决方法是增加tmp_table的大小:

     

SET SESSION max_heap_table_size = 536870912; SET SESSION   tmp_table_size的= 536870912;

     

现在我的请求正常工作!

或检查可用磁盘空间