mysql查詢不區分大小寫解決方案


mysql字符集和校對規則

有時在使用mysql時字符串的查詢條件不管大小寫都能查詢到數據,例如:輸入 aaa 或者aaA ,AAA都能查詢同樣的結果,說明查詢條件對大小寫不敏感。

大小寫不敏感的根源在於字符集所使用的校對規則有關

1、查看mysql所有可用的字符集的命令是 
show character set

字符集是用來定義 MySQL 存儲字符串的方式,校對規則則是定義了比較字符串的方式。字符集和校對規則是一對多的關系,MySQL 支持 30 多種字符集的 70 多種校對規則。

校對規則命名約定:它們以其相關的字符集名開始,通常包括一個語言名,並且以_ci(case insensitive collation,不區分大小寫)、_cs(case sensitive collation,區分大小寫)或_bin(binary case sensitive collation,也就是說是區分大小寫的,二元,即比較是基於字符編碼的值而與language無關)結束。
2、服務器的字符集和校對規則
show variables like 'character_set_server';

 

show variables like 'collation_server';

可以看到當前服務器使用的字符集時utf8,該字符集對應的校對規則時utf8_general_ci,不區分大小寫的。

3、數據庫的字符集和校對規則

數據庫的字符集和校對規則在創建數據庫的時候指定,也可以在創建完數據庫后通過“alter database”命令進行修改。需要注意的是,如果數據庫里已經存在數據,因為修改字符集並不能將已有的數據按照新的字符集進行存放,所以不能通過修改數據庫的字符集直接修改數據的內容。
設置數據庫字符集的規則是:
  • 如果指定了字符集和校對規則,則使用指定的字符集和校對規則
  • 如果指定了字符集沒有指定校對規則,則使用指定字符集的默認校對規則
  • 如果沒有指定字符集和校對規則,則使用服務器字符集和校對規則作為數據庫的字符集和校對規則
推薦在創建數據庫的時候明確指定字符集和校對規則,避免受到默認值的影響。
當前數據庫的字符集和校對規則,可以使用 “ show variables like 'character_set_database '”和“show variables like ' collation_database '”命令
show variables like 'character_set_database';

show variables like 'collation_database';

4、表字符集和校對規則
表的字符集和校對規則在創建表的時候指定,可以通過 alter table 命令進行修改,同樣,如果表中已有記錄,修改字符集對原有的記錄並沒有影響,不會按照新的字符集進行存放。表的字段仍然使用原來的字符集。
設置表的字符集的規則和上面基本類似:
  • 如果指定了字符集和校對規則,使用指定的字符集和校對規則
  • 如果指定了字符集沒有指定校對規則,使用指定字符集的默認校對規則
  • 如果沒有指定字符集和校對規則,使用數據庫字符集和校對規則作為表的字符集和校對規則
推薦在創建表的時候明確指定字符集和校對規則,避免受到默認值的影響。
查看表的字符集和校對規則,可以使用 show create table 命令

解決mysql查詢大小寫不敏感

根據上面講解的字符集和校對規則可知,查詢時不區分大小寫時由於設置的校對規則大小寫不敏感導致的。

方法1、使用binary使大小寫區分

select * from some_table where binary str='abc'
select * from some_table where binary str='ABC'

這樣得到的查詢結果就大小寫敏感查詢了。

同理

SELECT DISTINCT(BINARY name) AS Name FROM X;

 

方法2、建表時指定區分大小寫的校對規則

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM