MySQL大小寫敏感說明

常常遇到的問題,一些不是特別重要可是又比較鬱悶的事情。例現在天這個MySQL大小寫敏感。
先上測試結果。

Linux環境下,不是windows平臺下。區別很大。注意。mysql

一圖勝千言
 
mysql> show create table Ac;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Ac    | CREATE TABLE `Ac` (
  `a` varchar(20) DEFAULT NULL,
  `c` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>
mysql> insert into Ac  values ('1q','1q');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into Ac  values ('1Q','1Q');
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from Ac WHERE a='1q';
+------+------+
| a    | c    |
+------+------+
| 1q   | 1q   |
| 1Q   | 1Q   |
+------+------+
2 rows in set (0.00 sec)
 
mysql> select * from AC ;
ERROR 1146 (42S02): Table 'test.AC' doesn't exist
mysql> select * from Ac  where A='1Q';
+------+------+
| a    | c    |
+------+------+
| 1q   | 1q   |
| 1Q   | 1Q   |
+------+------+
2 rows in set (0.00 sec)
 
如上的結果能反應說明如下結論。
 
MySQL在Linux下數據庫名、表名、列名、別名大小寫規則是這樣的:
  一、數據庫名與表名是嚴格區分大小寫的;
  二、表的別名是嚴格區分大小寫的;
  三、列名與列的別名在全部的狀況下均是忽略大小寫的;
      四、字段內容默認狀況下是大小寫不敏感的。
 
mysql中控制數據庫名和表名的大小寫敏感由參數lower_case_table_names控制,爲0時表示區分大小寫,爲1時,表示將名字轉化爲小寫後存儲,不區分大小寫。
mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)
 
修改cnf配置文件或者編譯的時候,須要重啓服務。
 
 
 MySQL存儲的字段是不區分大小寫的。這個有點難以想象。尤爲是在用戶註冊的業務時候,會出現笑話。因此仍是嚴格限制大小寫敏感好比好。
 
如何避免字段內容區分大小寫。就是要新增字段的校驗規則。
能夠看出默認狀況下字段內容是不區分大小寫的。大小寫不敏感。
 
mysql> create table aa (a varchar(20)  BINARY  , c varchar(20)) ;
Query OK, 0 rows affected (0.10 sec)
 
mysql> show create table aa;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
| aa    | CREATE TABLE `aa` (
  `a` varchar(20)  CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `c` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> select * from aa;
+------+------+
| a    | c    |
+------+------+
| a    | C    |
| a    | C    |
| A    | c    |
+------+------+
3 rows in set (0.00 sec)
 
mysql> select * from aa where a = 'a';
+------+------+
| a    | c    |
+------+------+
| a    | C    |
| a    | C    |
+------+------+
2 rows in set (0.00 sec)
 
mysql> select * from aa where a = 'A';
+------+------+
| a    | c    |
+------+------+
| A    | c    |
+------+------+
1 row in set (0.00 sec)
 
緣由以下:
字段值的大小寫由 mysql的校對規則來控制。提到校對規則,就不得不說字符集。字符集是一套符號和編碼,校對規則是在字符集內用於比較字符的一套規則  .
通常而言,校對規則以其相關的字符集名開始,一般包括一個語言名,而且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束 。好比 utf8字符集,utf8_general_ci,表示不區分大小寫,這個是utf8字符集默認的校對規則;utf8_general_cs表示區分大小寫,utf8_bin表示二進制比較,一樣也區分大小寫 。
 
記錄下!
相關文章
相關標籤/搜索