DataGrip 使用 FOUND_ROWS() 函数得到结果总是为1

667 阅读1分钟

DataGrip 使用 FOUND_ROWS() 函数得到结果总是为1

FOUND_ROWS() 是做什么的

原文:A SELECT statement may include a LIMIT clause to restrict the number of rows the server returns to the client. In some cases, it is desirable to know how many rows the statement would have returned without the LIMIT, but without running the statement again. To obtain this row count, include an SQL_CALC_FOUND_ROWS option in the SELECT statement, and then invoke FOUND_ROWS() afterward:

简单说就是:SELECT 后包含 SQL_CALC_FOUND_ROWS,就可以用 FOUND_ROWS() 查询到上次SELECT多少条数据

打开 Datagrip 测试一下

先查一下总的数据,一共有4条数据

SELECT * FROM l_user;

image.png

再查一下分页的数据

SELECT SQL_CALC_FOUND_ROWS * FROM l_user LIMIT 0, 2;

image.png

再查询行数

SELECT FOUND_ROWS();

image.png

可以看到FOUND_ROWS的结果是1。

这······与文档不符啊。

拿到MySQL命令行里执行一下试试

image.png

猜测应该是DataGrip的问题了。

查看下是否打开记录历史sql

show variables like '%general_log%';

image.png

general_logon,说明是开着的

打开 general_log_file 的值对应的文件,先清空一下,然后再次在DataGrip里执行

SELECT SQL_CALC_FOUND_ROWS * FROM l_user LIMIT 0, 2;
SELECT FOUND_ROWS();

可以从log文件里看到,我们在DataGraip执行每一条SQL前后,它都会执行一些SQL命令

image.png

比如先执行 SET SQL_SELECT_LIMIT=501,再 SELECT FOUND_ROWS(); 得到的结果肯定是1喽

这个问题在 idea 家族的 youtrack 存在好长时间了没解决。

扩展

SQL_SELECT_LIMIT=501 是干什么的

原文: image.png 说白了就是:限制 select 返回的最大行数。

做个实验: 先把 SQL_SELECT_LIMIT 设置成1,然后还是查询l_user

image.png

只得到了一条数据。

参考文档

  1. dev.mysql.com/doc/refman/…
  2. dev.mysql.com/doc/refman/…
  3. youtrack.jetbrains.com/issue/DBE-7…