MySQL查詢未區分大小寫
阿新 • • 發佈:2021-07-10
MySQL中,查詢條件匹配的時候是否區分大小寫?什麼情況下區分?什麼情況下不區分?遇到需要區分但是沒有區分的場景該如何處理?
,但是結果把
場景
考慮如下場景:
mysql> use test_0705;
Database changed
mysql> select * from tb_test where name = 'CodingCat';
+----+-----------+
| id | name |
+----+-----------+
| 1 | CodingCat |
| 2 | CODINGCAT |
| 3 | codingcat |
+----+-----------+
3 rows in set (0.02 sec)
mysql>
從上圖我們看到,查詢條件中指定要查詢的是name='CodingCat'
CODINGCAT
和codingcat
一起給查詢出來了,可見此查詢結果並未區分大小寫。
探究
我們知道,在MySQL中有排序規則這個概念,排序規則表示在規定的儲存的資料編碼格式下的比較規則,如是否區分大小寫等。針對上面的場景,查看錶結構如下:
mysql> show create table tb_test; +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_test | CREATE TABLE `tb_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.04 sec) mysql>
該表繼承了資料庫的排序規則,資料庫建表語句如下:
mysql> show create database test_0705; +-----------+--------------------------------------------------------------------+ | Database | Create Database | +-----------+--------------------------------------------------------------------+ | test_0705 | CREATE DATABASE `test_0705` /*!40100 DEFAULT CHARACTER SET utf8 */ | +-----------+--------------------------------------------------------------------+ 1 row in set (0.03 sec) mysql>
從資料庫建表語句來看,並沒有指定排序規則,則該資料庫繼承了全域性的排序規則,檢視資料庫的排序規則如下:
mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.38 sec)
mysql>
從全域性的配置來看,資料庫伺服器使用的是utf8mb4_general_ci
排序規則,字尾有ci,意思是case insensitive,即大小寫不敏感,所以查詢出來的結果不區分大小寫。
在MySQL中,排序規則常見有帶字尾ci和不帶ci兩種,如utf8_bin和utf8_genera_ci,帶ci表示區分大小寫,否則不區分。
解決
對於上面的問題,如果在設定了字元排序規則是帶ci字尾的,但是又想要查詢結果是區分大小寫,怎麼做?有兩種解決方法。
-
查詢時在需要區分大小寫的欄位條件上使用binary關鍵字
mysql> select * from tb_test where binary name = 'CodingCat'; +----+-----------+ | id | name | +----+-----------+ | 1 | CodingCat | +----+-----------+ 1 row in set (0.04 sec) mysql>
-
修改表中欄位的排序規則
mysql> ALTER TABLE tb_test MODIFY COLUMN name VARCHAR(255) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL; Query OK, 3 rows affected (0.08 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> show create table tb_test; +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_test | CREATE TABLE `tb_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.05 sec) mysql> select * from tb_test where binary name = 'CodingCat'; +----+-----------+ | id | name | +----+-----------+ | 1 | CodingCat | +----+-----------+ 1 row in set (0.05 sec) mysql>