即使没有返回行,MySQL/MariaDB FOUND_ROWS 也会返回 1

Posted

技术标签:

【中文标题】即使没有返回行,MySQL/MariaDB FOUND_ROWS 也会返回 1【英文标题】:MySQL/MariaDB FOUND_ROWS returns 1 even if no rows were returned 【发布时间】:2018-05-13 09:22:28 【问题描述】:

我正在运行 MariaDB 版本 5.5.56,并且似乎遇到了一个错误:FOUND_ROWS() 在返回零行的 SELECT 之后返回“1”。

根据bug report 83110,mysql 从 5.7.15 版开始就有这个问题,但似乎是一个已解决的问题,所以我认为它已修复。但是,我不确定 MySQL 和 MariaDB 版本号是如何关联的,或者对 MySQL 的修复是否适用于 MariaDB。

我的发行版的软件包包括 MariaDB 5.5.56 作为可用的最新版本。

我做错了吗?为什么前一个查询返回零结果时 FOUND_ROWS 返回 1? (是的,我确实在上一个查询中包含了 SQL_CALC_FOUND_ROWS 语句。

例子:

SELECT SQL_CALC_FOUND_ROWS * FROM table1
    WHERE field = 'something that would not match any records' LIMIT 5;
SELECT FOUND_ROWS() as count_of_rows;

-- count_of_rows = 1

这可能是同一个错误,只是在 MariaDB 中未打补丁,还是您认为我做错了什么?

谢谢!

【问题讨论】:

你怎么看count_of_rows的值? 我 1)通过 php 中的查询获取值,2)作为测试,在 phpmyadmin 中同时运行这两个查询。 1) PDO 还是 mysqli?哈希还是数组? 2)它是否添加了LIMIT Mysqli,是的,有一个限制子句。 LIMIT 有很大的不同;将其添加到问题中。 【参考方案1】:

MariaDB 5.5 与 MySQL 5.7 匹配(包括我认为的所有错误)。 MariaDB 使用 JIRA (https://jira.mariadb.org/),您可以看到 SQL_CALC_FOUND_ROWS 的一些不同错误已得到解决。

我在 MariaDB 10.3(当前的 GA 版本)上进行了尝试,并创建了一些示例架构:

create table foo (id integer primary key, name varchar(50));

并插入了几行:

insert into foo(id, name) values (1, 'Bob');
insert into foo(id, name) values (2, 'Chris');
insert into foo(id, name) values (3, 'David');
insert into foo(id, name) values (4, 'Esther');
insert into foo(id, name) values (5, 'Fred');
insert into foo(id, name) values (6, 'Ginger');

查询对我有用: select sql_calc_found_rows * from foo where name = 'x' limit 5;

SELECT FOUND_ROWS() as count_of_rows;
+---------------+
| count_of_rows |
+---------------+
|             0 |
+---------------+
1 row in set (0.010 sec)

【讨论】:

你用 LIMIT 语句测试了吗?

以上是关于即使没有返回行,MySQL/MariaDB FOUND_ROWS 也会返回 1的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

非常慢的 MySQL COUNT DISTINCT 查询,即使有索引——如何优化?

如何使用MariaDB返回本地时间SQL结果

SQL:在 MySQL/MariaDB 中选择具有窗口函数的某些行

Meteor:即使设置了 ANDROID_HOME 也没有设置

如何从 MySQL/Mariadb 获取用户 ID?