MySQL Active Record查询忽略大小写

3
我有以下的Active Record查询语句:
$this->db->select('id, firstname, surname');
$this->db->from('users');
$this->db->where('site_id',$siteid);
$this->db->like('firstname', $name);
$this->db->or_like('surname', $name); 
$query = $this->db->get();

这个查询在大多数情况下都是有效的,但如果数据库中的名称包含大小写字母,则可能会出现问题。如果大小写不匹配,查询将失败。

有没有办法让查询忽略大小写呢?


1
MySQL通常是不区分大小写的。你的表格使用的排序规则是什么?这会生成什么样的SQL语句? - Ken
嗨,肯恩,感谢您的及时回复。该表的排序规则为'utf8_bin',生成的SQL如下: codeSELECT id, firstname, surname FROM (users) WHERE site_id = '1' AND firstname LIKE '%ben%' OR surname LIKE '%ben%' - Ben
看起来UTF8_bin是我的问题 - [链接]https://dev59.com/DG455IYBdhLWcg3wD_6Z[/链接] - Ben
@Ken,你应该尽量避免将代码限制在特定的数据库服务器或排序规则上。如果你想要在任何情况下进行不区分大小写的搜索,那么请单独存储搜索字段的小写或大写形式,并在其上进行搜索。 - Ashwini Dhekane
确认问题是由于我的排序设置为UTF8_bin所导致的。非常感谢@Ken指引我正确的方向。最好的问候,Ben。 - Ben
Ashwini:如果你想让它在数据库服务器上不受限制(对于这个查询),为什么不只是在两边都包裹LOWER()呢?我认为在这里存储额外的数据并破坏第三范式没有任何好处。 - Ken
2个回答

2
尝试这个,对我来说效果很好: (您可以在两侧使用小写或大写模式来进行不区分查询)
$this->db->select('id, firstname, surname');
$this->db->from('users');
$this->db->where('site_id',$siteid);
$this->db->like('lower(firstname)', strtolower($name));
$this->db->or_like('lower(surname)', strtolower($name)); 
$query = $this->db->get();

1

在mysql中操作大小写的一种方法是将您的firstname字段设置为大写或小写,并将给定的字符串转换为该格式并进行匹配。

编辑:like是一个运算符,它取决于您使用的数据库是否区分大小写。在postgres中,它是不区分大小写的,而在mysql中它是区分大小写的。因此,它取决于您使用的数据库。

编辑:另一种可行但不太有用的方法是在给定字段上使用ucase()或lcase()函数,然后与匹配的小写或大写进行匹配。虽然这会有性能问题。


默认情况下,PostgreSQL中的搜索区分大小写。为了使其不区分大小写,他们建议使用ILIKE。与您在MySQL中的语句相反,默认情况下,在MySQL中的搜索是不区分大小写的。 - KAsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接