【问题标题】:MySQL returns all rows with empty string as where clauseMySQL返回空字符串作为where子句的所有行
【发布时间】:2011-11-30 18:58:55
【问题描述】:

我在调试CodeIgniter活动记录时发现了这个问题,如下所示:

$this->db->from("table_name");
$this->db->where("field_name", "");
$result = $this->db->get()->result_array();

结果查询是:

SELECT * FROM `table_name` WHERE `field_name` = 0;  // Returns all rows in table

即使将空字符串强制转换为 0,我们仍希望得到一个空结果,因为 table_name.field_name 充满了非空字符串值。但是,我从这个查询中得到了整个表。有谁明白为什么?这一点都不直观。

我尝试了没有强制转换为 0 的查询,它可以工作:

SELECT * FROM `table_name` WHERE `field_name` = "";  // Empty result

为什么要强制转换为 0?


编辑:使用这种替代 CodeIgniter 语法会发生相同的强制转换为 0:

$this->db->query('SELECT * FROM table_name WHERE field_name = ?', array(""));

【问题讨论】:

  • 您使用的是什么数据库驱动程序?字段类型?我怀疑是 Active Record 参数化的一部分,您可以查看它的核心
  • 可以快速浏览一下 db 库中的 where 函数。可能是一个简单的条件,您可以通过覆盖来修复。
  • 如果 field_name 字段是 char/varchar,它们也将被转换为整数,并且很可能映射为 0,因此您仍然匹配整个表。
  • 因为 field_name 是 varchar MYSQL 期望比较的两边都有一个字符串。现在您在右侧有整数,它使mysql将左侧评估为整数,最终条件为0=0
  • 谢谢大家。我明白为什么与 0 的比较会产生所有结果。也就是说,我剩下的问题是:为什么要强制转换为 0?这是最不直观的部分,也是破坏预期行为的部分。也许我们可以将其称为 CodeIgniter 的错误

标签: php mysql codeigniter casting


【解决方案1】:

如果您使用的是codeigniter,请尝试使用以下内容:

$this->db->where("field_name = ''");

【讨论】:

  • 我不是直接搜索“”,而是一个可能是空字符串的 $variable。利用 codeigniter 的原生转义而不是直接将变量插入字符串是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多