【问题标题】:MySQL Active record query ignoring caseMySQL活动记录查询忽略大小写
【发布时间】:2011-04-11 17:39:43
【问题描述】:

我有以下活动记录查询:

$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();

这很好用,但我在数据库中的名字可以包含大写和小写的名字。如果大小写不匹配,则查询失败。

有什么方法可以忽略我的查询的情况吗?

【问题讨论】:

  • MySQL 通常不区分大小写。你桌子上的排序规则是什么?这会生成什么 SQL?
  • 您好,Ken,感谢您的及时回复。该表的排序规则是'utf8_bin',生成的SQL如下:codeSELECT id, firstname, surname FROM (users) WHERE site_id = '1' AND firstname LIKE '%ben%' 或 surname LIKE '%ben%'
  • 看来 UTF8_bin 是我的问题 - [link]stackoverflow.com/questions/4558707/…
  • @Ken 您应该尽量不要将您的代码限制在特定的数据库服务器或排序规则中。如果您在任何情况下都想要不区分大小写的搜索,请分别存储搜索字段的小写或大写并搜索它们。
  • 确认是我的排序规则设置设置为 UTF8_bin 并导致了问题。非常感谢@Ken 为我指明了正确的方向。最好的问候,本。

标签: mysql codeigniter activerecord case-insensitive


【解决方案1】:

试试这个,它对我来说很好用: (可以两边都使用lower或者upper模式进行不敏感查询)

$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();

【讨论】:

    【解决方案2】:

    在 mysql 中操作区分大小写的方法之一是让您的名字字段在 db 中为大写或小写,并将给定的字符串转换为该格式并匹配它。

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

    edit:另一种工作但不是那么有用的方法是在给定字段上使用 ucase() 或 lcase() 函数,然后与匹配的小写或大写匹配。虽然它会有性能问题。

    【讨论】:

    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2020-04-25
    • 2011-03-23
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多