MySQL查询WHERE区分大小写

时间:2017-10-09 23:22:58

标签: php mysql codeigniter

我有以下方法:( Codeigniter模型)

/**
 * Get an Ad based on its hash
 *
 * @param $hash
 * @return bool
 */
public function getAdbyHash($hash)
{
    $this->db->select('category.id as category_id, category.subcat as category_name, provinces.id as provinces_id, provinces.prov_name, users.id as users_id, users.*, ads.*');
    $this->db->where('ads.hash', $hash);

    $this->db->join('category', 'category.id = ads.subcat_id');
    $this->db->join('provinces', 'provinces.id = ads.province_id');
    $this->db->join('users', 'users.id = ads.user_id', 'left');

    $r = $this->db->get('ads');

    //echo $this->db->last_query();

    if ($r->num_rows() == 1) {
        $ad = $r->result()[0];
        return $ad;
    }
    return FALSE;
}

它的工作正常。但今天我试图破解自己在URL中引入类似的哈希,以及它的工作,但这并不是理想的行为。
所以这个哈希:edit / zIpM41NkS8igFXaC必须与edit / zIpM41NkS8igFXac相同

注意最后一个字符(C / c) 如何查询区分大小写?

我的方法是使用Codeigniter的特定方法而不使用直接SQL语句。但无论如何都是有效的。

2 个答案:

答案 0 :(得分:2)

尝试:

path
  

$ this-> db->其中()接受可选的第三个参数。如果你设置它   为FALSE,CodeIgniter不会尝试保护您的字段或表格   带反叛的名字。   的 CodeIgniter Doc. Where

要清理数据,您可以尝试以下方法:

$this->db->where('ads.hash like binary "'.$hash.'"', NULL, FALSE)

答案 1 :(得分:2)

正如@Vixed建议的那样,您可以修改where条件。

但是,您也可以将ads.hash列修改为区分大小写

ALTER TABLE `ads` MODIFY `hash` VARCHAR(255) CHARACTER SET utf8 COLLATE `utf8_bin`;

请注意,对于Unicode,您只能使用utf8_bin进行区分大小写的比较。这是因为MySQL没有区分大小写的Unicode排序规则(请参阅此post

但如果您的排序规则为latin,只需将其更改为latin_general_cs

此外,如果您的专栏中有一些特定数据,您可以查看此SO帖子 - How to change Column Collation without losing or changing data?

<强> UPD。表现说明

好吧,like binary看起来像一个非常昂贵的操作(如上所述here)。另外,我认为您希望看到这些帖子:SQL 'like' vs '=' performanceWhat effects does using a binary collation have?

无论如何,它需要测试