Ste*_*enB 261 mysql sql interop case-sensitive string-comparison
我有一个函数返回五个字符混合大小写.如果我对这个字符串进行查询,它将返回值而不管大小写.
如何使MySQL字符串查询区分大小写?
Cra*_*ite 677
好消息是,如果你需要做一个区分大小写的查询,这是很容易做到:
SELECT * FROM `table` WHERE BINARY `column` = 'value'
Run Code Online (Sandbox Code Playgroud)
dru*_*dge 145
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
Run Code Online (Sandbox Code Playgroud)
如果希望始终以区分大小写的方式处理列,请使用区分大小写或二进制排序规则来声明它.
Nit*_*esh 43
克雷格怀特发布的答案,性能损失很大
SELECT * FROM `table` WHERE BINARY `column` = 'value'
Run Code Online (Sandbox Code Playgroud)
因为它不使用索引.因此,您需要更改表格排序,如https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html所述.
要么
最简单的修复,您应该使用值的BINARY.
SELECT * FROM `table` WHERE `column` = BINARY 'value'
Run Code Online (Sandbox Code Playgroud)
例如.
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 |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
1排(0.00秒)
小智 38
您可能希望使用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'
Run Code Online (Sandbox Code Playgroud)
它的状态需要'a'而不是'A'
Pau*_*ler 27
在不更改被查询列的排序规则的情况下执行区分大小写的字符串比较的最正确方法是为要比较的列的值显式指定字符集和排序规则。
select * from `table` where `column` = convert('value' using utf8mb4) collate utf8mb4_bin;
Run Code Online (Sandbox Code Playgroud)
binary?不建议使用binary运算符,因为它比较编码字符串的实际字节。如果您比较使用不同字符集编码的两个字符串的实际字节数,则两个应该被视为相同的字符串可能不相等。例如,如果您有一个使用latin1字符集的列,并且您的服务器/会话字符集是utf8mb4,那么当您将该列与包含重音符号的字符串(例如 'café' )进行比较时,它将不匹配包含相同字符串的行!这是因为在latin1é 中被编码为字节,0xE9但在utf8其中是两个字节:0xC3A9.
convert以及collate?排序规则必须与字符集匹配。因此,如果您的服务器或会话设置为使用latin1您必须使用的字符集,collate latin1_bin但如果您的字符集是utf8mb4您必须使用collate utf8mb4_bin. 因此,最可靠的解决方案是始终将值转换为最灵活的字符集,并对该字符集使用二进制排序规则。
convertandcollate应用于值而不是列?当您在进行比较之前将任何转换函数应用于列时,它会阻止查询引擎使用索引(如果该列存在索引),这可能会大大减慢您的查询速度。因此,最好在可能的情况下转换该值。当在两个字符串值之间执行比较并且其中一个具有显式指定的排序规则时,查询引擎将使用显式排序规则,而不管它应用于哪个值。
需要注意的是,MySql 不仅对使用_ci排序规则(通常是默认设置)的列不区分大小写,而且不区分重音。这意味着'é' = 'e'. 使用二进制排序规则(或binary运算符)将使字符串比较区分重音和大小写。
utf8mb4?utf8MySql 中的字符集是最近版本中utf8mb3已弃用的别名,因为它不支持 4 字节字符(这对于编码字符串很重要,如 )。如果您希望在MySql 中使用UTF8 字符编码,那么您应该使用utf8mb4字符集。
小智 16
要在使用BINARY之前使用索引,如果你有大表,你可以这样做.
SELECT
*
FROM
(SELECT * FROM `table` WHERE `column` = 'value') as firstresult
WHERE
BINARY `column` = 'value'
Run Code Online (Sandbox Code Playgroud)
子查询将导致一个非常小的不区分大小写的子集,然后您可以选择唯一区分大小写的匹配.
小智 8
以下是MySQL版本等于或高于5.5.
添加到/etc/mysql/my.cnf
[mysqld]
...
character-set-server=utf8
collation-server=utf8_bin
...
Run Code Online (Sandbox Code Playgroud)
我尝试的所有其他排序规则似乎都不区分大小写,只有"utf8_bin"才有效.
不要忘记在此之后重启mysql:
sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)
根据http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html,还有一个"latin1_bin".
mysql启动不接受"utf8_general_cs".(我将"_cs"视为"区分大小写" - ???).
你可以像这样使用BINARY来区分大小写
select * from tb_app where BINARY android_package='com.Mtime';
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个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 |
+----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+
Run Code Online (Sandbox Code Playgroud)
幸运的是,我有一些技巧来解决这个问题
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 |
+----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
227879 次 |
| 最近记录: |