我有一个函数,返回5个混合大小写字符。如果我对这个字符串进行查询,不管大小写,它都会返回值。
如何使MySQL字符串查询区分大小写?
我有一个函数,返回5个混合大小写字符。如果我对这个字符串进行查询,不管大小写,它都会返回值。
如何使MySQL字符串查询区分大小写?
好消息是,如果你需要进行区分大小写的查询,这很容易做到:
SELECT * FROM `table` WHERE BINARY `column` = 'value'
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
The default character set and collation are latin1 and latin1_swedish_ci, so nonbinary string comparisons are case insensitive by default. This means that if you search with col_name LIKE 'a%', you get all column values that start with A or a. To make this search case sensitive, make sure that one of the operands has a case sensitive or binary collation. For example, if you are comparing a column and a string that both have the latin1 character set, you can use the COLLATE operator to cause either operand to have the latin1_general_cs or latin1_bin collation:
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
如果希望始终以区分大小写的方式对待列,请使用区分大小写或二进制排序规则来声明它。
不使用=运算符,您可能希望使用LIKE或LIKE二进制
// 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
下面是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”读成“区分大小写”- ??)
太好了!
我和你们分享一个比较密码的函数的代码:
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;
要在使用BINARY之前使用索引,如果有大型表,可以这样做。
SELECT
*
FROM
(SELECT * FROM `table` WHERE `column` = 'value') as firstresult
WHERE
BINARY `column` = 'value'
子查询将生成一个非常小的不区分大小写的子集,然后选择其中唯一区分大小写的匹配项。
您可以像这样使用二进制区分大小写
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 |
+----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+
克雷格·怀特(Craig White)发布的答案有很大的性能损失
SELECT * FROM `table` WHERE BINARY `column` = 'value'
因为它不使用索引。所以,要么你需要像这里提到的那样改变表的排序规则https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html。
OR
最简单的解决方法,你应该使用二进制值。
SELECT * FROM `table` WHERE `column` = BINARY 'value'
E.g.
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
set中的1行(0.00秒)
不需要改变任何DB级别,只是你必须改变SQL查询它将工作。
的例子,
“SELECT * FROM <TABLE> where userId = ' ' ' + iv_userId + ' ' AND password = ' ' ' ' ' + iv_password + ' '";
二进制关键字将区分大小写。
对于那些希望使用RLIKE或REGEXP与正则表达式进行区分大小写的比较的人来说,你可以使用REGEXP_LIKE()来匹配匹配类型c,如下所示:
SELECT * FROM `table` WHERE REGEXP_LIKE(`column`, 'value', 'c');