mysql中varchar 大小寫敏感問題

首先解釋一下問題,大小寫敏感分爲兩個層面:html

  1. varchar類型的值,insert 和 select 的結果是不是大小寫敏感的?
  2. varchar類型的數據在比較的時候是不是大小寫敏感的?

insert 和get 是否大小寫敏感

經過查詢mysql的配置參數,能夠得到mysql自己對於varchar類型的字符存儲是不是大小寫敏感的:show Variables like '%lower_case_table_names',結果是mysql

  1. 0表示大小寫敏感;
  2. 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

varchar類型的數據比較是不是大小寫敏感

常見的進行數據比較的場景如:排序

  1. 使用了比較運算符,$>=, >, =, <, <=$
  2. 排序操做,group,order
  3. like操做

在數據比較時,繼承

  1. 非字節類型數據,如CHAR, VARCHAR, TEXT類型,數據比較會使用數據的排序規則(collation配置);
  2. 字節類型數據,如BINARY, VARBINARY, BLOB類型,數據比較二進制的每一個字節;
  3. 非字節類型數據和字節類型數據比較會按照字節類型數據比較規則進行。

數據庫的默認編碼通常是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。

參考

  1. case-sensitivity
相關文章
相關標籤/搜索