我怎样才能使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格式和东西弄脏你的手…你知道我在说什么吗?