Php MySQL查询,区分大小写
我有以下方法:Codeigniter模型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
/**
* 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子句中的强制转换、强制转换和转换。如另一个答案所示,使用字符串连接和插值是一种不可接受的危险做法。