簡體   English   中英

MySQL查詢在哪里區分大小寫

[英]MySQL query WHERE case sensitive

我有以下方法:(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語句。 但是仍然可以。

嘗試:

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

$ this-> db-> where()接受可選的第三個參數。 如果將其設置為FALSE,則CodeIgniter不會嘗試使用反引號保護您的字段或表名。 CodeIgniter文件 哪里

要清除數據,您可以嘗試以下操作:

public function getAdbyHash($hash)
{
    $db = get_instance()->db->conn_id;
    $hash= mysqli_real_escape_string($db, $hash);
    $this->db->select('category.id as.....'
    $this->db->where('ads.hash like binary "'.$hash.'"', NULL, FALSE);
    $this->db->join('cate......'

按照@Vixed的建議,您可以修改where條件。

而且,您可以修改ads.hash列以區分大小寫

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

請注意,對於Unicode,只能使用utf8_bin進行區分大小寫的比較。 這是因為MySQL沒有區分大小寫的Unicode排序規則(請參閱此文章

但是,如果您的排序規則是latin ,請將其更改為latin_general_cs

另外,如果您的列中有一些特定數據,則可以查看此SO帖子- 如何更改列排序規則而不丟失或更改數據?

UPD。 性能說明

那么, like binary看起來像一個非常昂貴的操作(如提到這里 )。 另外,我認為您會希望看到以下帖子: SQL的“ like”與“ =”性能以及使用二進制排序規則有什么影響?

無論如何,這需要測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM