Php MySQL查询,区分大小写

Php MySQL查询,区分大小写,php,mysql,codeigniter,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_i

我有以下方法: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不会试图保护您的字段或表 带背景标记的名称。

要清除数据,可以尝试以下操作:

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排序规则看到了吗

但如果您的排序规则是拉丁语,只需将其更改为拉丁语\u general\u cs即可

此外,如果你的专栏中有一些具体数据,你可以看看这篇文章-

UPD。性能说明

正如前面提到的,二进制看起来是一个非常昂贵的操作。还有,我想你会想看看这些帖子:还有


无论如何,它需要测试

是否将列编码更改为区分大小写?再看看这个可能的副本,我该怎么做?@ErichGarcía你有权访问你的数据库吗?通过phpmyadmin或mysqlconsole@Rulisp是的,我有权限。好的,这个可以用!但是,第二个和第三个参数是什么意思?字符串串联是非常危险的建议。好了,现在明白了。哈希是从URL GET参数获得的。我不保护字段名。那么,这对MySQL注入或XSS是一种风险吗?是的,我的建议是在函数中清除$this->db->select之前的$hash。我现在很忙,但我想我可以稍后提供一个例子。哈哈哈,效果很好,但是,给我留点东西吧,哈哈哈。嗯,很好的提示。但是,一百万个问题是:哪个解决方案更为最优?我是MySQL的新手,但我知道每毫秒都很重要。谢谢@ErichGarcía更新了答案。测试确实是必需的,因为如果每个查询都有几毫秒的空闲时间,在某种程度上它并不重要。但若差异在几十毫秒甚至更大,你们应该优化你们的搜索。有一次,我使用附加列和字符串的CRC32哈希进行搜索optimization@ErichGarc是的,没有必要进行比较。这是正确的解决方案,也是最理想的解决方案。几乎总是最好避免WHERE子句中的强制转换、强制转换和转换。如另一个答案所示,使用字符串连接和插值是一种不可接受的危险做法。