我怎样才能使MySQL的大小写敏感字符串比较MySQL?
我有一个返回五个字符混合大小写的函数。 如果我对这个字符串进行查询,它会返回值而不管大小写。
我如何使MySQL字符串查询区分大小写?
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
缺省字符集和排序规则是latin1和latin1_swedish_ci,因此非二进制字符串比较默认情况下不区分大小写。 这意味着如果使用col_name LIKE'a%'进行搜索,则会获得以A或a开头的所有列值。 要使搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。 例如,如果要比较一个列和一个都具有latin1字符集的字符串,则可以使用COLLATE运算符来使两个操作数具有latin1_general_cs或latin1_bin排序规则:
col_name COLLATE latin1_general_cs LIKE 'a%' col_name LIKE 'a%' COLLATE latin1_general_cs col_name COLLATE latin1_bin LIKE 'a%' col_name LIKE 'a%' COLLATE latin1_bin
如果您想要以区分大小写的方式始终处理列,请使用区分大小写或二进制排序规则来声明。
好消息是,如果你需要做一个区分大小写的查询,这很容易:
SELECT * FROM `table` WHERE BINARY `column` = 'value'
而不是使用=运算符,您可能想使用LIKE或LIKE BINARY
// this returns 1 (true) select 'A' like 'a' // this returns 0 (false) select 'A' like binary 'a' select * from user where username like binary 'a'
它的状态将采取“a”而不是“A”
要在使用BINARY之前使用索引,如果您有大表,可以这样做。
SELECT * FROM (SELECT * FROM `table` WHERE `column` = 'value') as firstresult WHERE BINARY `column` = 'value'
子查询将导致一个非常小的不区分大小的子集,然后您将选择唯一的区分大小写的匹配项。
答复贴,Craig White,有很大的表现处罚
SELECT * FROM `table` WHERE BINARY `column` = 'value'
因为它不使用索引。 所以,要么你需要改变表格整理,就像这里提到https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html 。
要么
最简单的修复方法是,您应该使用二进制值。
SELECT * FROM `table` WHERE `column` = BINARY 'value'
例如。
mysql> EXPLAIN SELECT * FROM temp1 WHERE BINARY col1 = "ABC" AND col2 = "DEF" ; +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | 1 | SIMPLE | temp1 | ALL | NULL | NULL | NULL | NULL | 190543 | Using where | +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
VS
mysql> EXPLAIN SELECT * FROM temp1 WHERE col1 = BINARY "ABC" AND col2 = "DEF" ; +----+-------------+-------+-------+---------------+---------------+---------+------+------+------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------------+---------+------+------+------------------------------------+ | 1 | SIMPLE | temp1 | range | col1_2e9e898e | col1_2e9e898e | 93 | NULL | 2 | Using index condition; Using where | +----+-------------+-------+-------+---------------+---------------+---------+------+------+------------------------------------+ enter code here
一排(0.00秒)
以下是MySQL版本等于或高于5.5。
添加到/etc/mysql/my.cnf
[mysqld] ... character-set-server=utf8 collation-server=utf8_bin ...
我尝试过的所有其他排序规则似乎不区分大小写,只有“utf8_bin”起作用。
在此之后不要忘记重新启动mysql:
sudo service mysql restart
根据http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html还有一个“latin1_bin”。;
“utf8_general_cs”没有被mysql启动接受。 (我读“_cs”为“区分大小写”)。
你可以使用BINARY来区分大小写
select * from tb_app where BINARY android_package='com.Mtime';
不幸的是,这个SQL不能使用索引,你会受到依赖于该索引的查询的性能影响
mysql> explain select * from tb_app where BINARY android_package='com.Mtime'; +----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+ | 1 | SIMPLE | tb_app | NULL | ALL | NULL | NULL | NULL | NULL | 1590351 | 100.00 | Using where | +----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+
幸运的是,我有一些技巧来解决这个问题
mysql> explain select * from tb_app where android_package='com.Mtime' and BINARY android_package='com.Mtime'; +----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+ | 1 | SIMPLE | tb_app | NULL | ref | idx_android_pkg | idx_android_pkg | 771 | const | 1 | 100.00 | Using index condition | +----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+
无需在数据库级别更改任何内容,只需要更改SQL Query就可以工作。
示例 –
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";
二进制关键字会区分大小写。
默认情况下,mysql不区分大小写,请尝试将语言归类更改为latin1_general_cs
优秀!
我与你分享一个比较密码的函数的代码:
SET pSignal = (SELECT DECODE(r.usignal,'YOURSTRINGKEY') FROM rsw_uds r WHERE r.uname = in_usdname AND r.uvige = 1); SET pSuccess =(SELECT in_usdsignal LIKE BINARY pSignal); IF pSuccess = 1 THEN /*Your code if match*/ ELSE /*Your code if don't match*/ END IF;
通常这就是你的LIKE查询的样子(你看我在那做了什么;-)):
SELECT * FROM WHERE LIKE'%%'
现在,要做一个不区分大小写的查询,可以使用LOWER()函数:
SELECT * FROM LOWER()LIKE LOWER('%%');
这将帮助您避免让COLLATE格式和东西弄脏你的手…你知道我在说什么吗?