1. 程式人生 > 其它 >MySQL查詢未區分大小寫

MySQL查詢未區分大小寫

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'

,但是結果把CODINGCATcodingcat一起給查詢出來了,可見此查詢結果並未區分大小寫。

探究

我們知道,在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>