首先解釋一下問題,大小寫敏感分爲兩個層面:html
經過查詢mysql的配置參數,能夠得到mysql自己對於varchar
類型的字符存儲是不是大小寫敏感的:show Variables like '%lower_case_table_names'
,結果是mysql
0
表示大小寫敏感;1
表示大小寫不敏感;例如,建立一個數據庫:sql
CREATE TABLE `test` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
使用的排序規則collation=utf8_general_ci
。數據庫
插入數據:函數
insert into test values ('a'); insert into test values ('A');
查詢數據在mysql中存儲的ascii碼:編碼
mysql> select name, ASCII(name) from test; +------+-------------+ | name | ASCII(name) | +------+-------------+ | a | 97 | | A | 65 | +------+-------------+ 2 rows in set (0.00 sec)
ASCII
函數返回字符串最左邊字符的ascii碼。code
存儲在數據庫中的字符ascii碼是不一樣的,因此區分了大小寫。htm
常見的進行數據比較的場景如:排序
group
,order
在數據比較時,繼承
CHAR
, VARCHAR
, TEXT
類型,數據比較會使用數據的排序規則(collation配置);BINARY
, VARBINARY
, BLOB
類型,數據比較二進制的每一個字節;數據庫的默認編碼通常是charset=utf8
排序規則collation=utf8_general_ci
,那麼在比較的時候,非字節類型字符串就是大小寫不敏感的。若是使用了相似LIKE 'a%'
,會將a%
和A%
所有獲取出來。
utf8_bin
將字符串中的每個字符用二進制數據存儲,區分大小寫。utf8_genera_ci
不區分大小寫,ci爲case insensitive的縮寫,即大小寫不敏感。utf8_general_cs
區分大小寫,cs爲case sensitive的縮寫,即大小寫敏感。
若是但願字符串比較時是大小寫敏感的,那麼須要修改排序規則。
若是須要在查詢中對非字符類型的數據進行比較操做,那麼建議將database的排序規則改成utf8_bin
,這樣改database下的全部數據庫均繼承於database的collation支持排序。 若是僅僅是一個表須要支持,那麼僅須要更新一個表的collection;甚至僅須要更改一個column的排序規則,也能夠更新列的collection。