Mysql大小寫敏感

Mysql大小寫敏感

字符串大小寫敏感和Mysql的資料庫的名字、表名字、字段名字、還有字段值有關。

1.和資料庫名字、表名字、存儲過程和觸發器有關
Mysql中控制資料庫名和表名的大小寫敏感是由參數lower_case_table_names控制,
為0時;
表示區分大小寫,使用CREATE TABLE或CREATE DATABASE語句指定的大小寫字母在硬盤上保存表名和資料庫名。
名稱比較對大小寫敏感。在大小寫不敏感的操作系統如windows或Mac OS x上我們不能將該參數設為0,如果在
大小寫不敏感的文件系統上將–lowercase-table-names強制設為0,並且使用不同的大小寫訪問MyISAM表名,
可能會導致索引破壞。

為1時;
表示將名字轉化為小寫後存儲,名稱比較對大小寫不敏感。MySQL將所有表名轉換為小寫在存儲和查找表上。
該行為也適合資料庫名和表的別名。該值為Windows的默認值。

為2時;
表名和資料庫名在硬盤上使用CREATE TABLE或CREATE DATABASE語句指定的大小寫字母進行保存,但MySQL將它們
轉換為小寫在查找表上。名稱比較對大小寫不敏感,即按照大小寫來保存,按照小寫來比較。註釋:隻在對大小
寫不敏感的文件系統上使用! innodb表名用小寫保存。

如果你使用innodb表,為瞭避免避免大小寫敏感問題,可以把lower_case_table_names=1

把lower_case_table_names從0改變為1
在你把lower_case_table_names設置為1時,在restart你的mysqld之前,請把資料庫名和表名更改為小寫
mysql> RENAME TABLE T1 TO t1;

2.和字段名字有關
字段名是不區分大小寫的

3.和字段值有關
字段值的大小寫由Mysql的collate來控制。提到collate,就不得不說字符集。字符集是一套符號和編碼,collate
是在字符集內用於比較字符的一套規則,比如設定'A'<'B'這樣的關系的規則。不同的字符集有多種校對規則,一般
而言,collate以其相關的字符集名開始,通常包括一個語言名,並且以_ci(大小寫不敏感)、_cs(大小寫敏感)
或_bin(二元)結束 。

比如 utf8字符集:
utf8_general_ci,表示不區分大小寫,這個是utf8字符集默認的collate;
utf8_general_cs表示區分大小寫,
utf8_bin表示二進制比較,同樣也區分大小寫。

查看資料庫的字符集相關信息
 

mysql> show variables like '%character%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)

查看資料庫collation相關信息
 

mysql> show variables like '%collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.01 sec)

test是默認創建的資料庫
 

mysql> show create database test;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

testx是指定字符集和collation的資料庫

mysql> create database testx default character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)

mysql> show create database testx;
+----------+---------------------------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------------------------+
| testx | CREATE DATABASE `testx` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

case2是默認創建的表
 

mysql> show create table case2;
+-------+------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------+
| case2 | CREATE TABLE `case2` (
`a` int(11) DEFAULT NULL,
`B` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

case4是指定字符集和collate的表

mysql> create table case4(a int(11),B varchar(10)) default character set utf8 collate utf8_bin;;
Query OK, 0 rows affected (0.12 sec)

mysql> show create table case4;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| case4 | CREATE TABLE `case4` (
`a` int(11) DEFAULT NULL,
`B` varchar(10) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

我們可以在創建資料庫或表時指定是否大小寫敏感,如果沒有指定的話,通過語句級的collate和binary也可以實現

mysql> select * from case1;
+------+------+
| a | B |
+------+------+
| 1 | AAA |
| 2 | bbb |
| 4 | AAA |
| 3 | BBB |
+------+------+
4 rows in set (0.00 sec)

mysql> select * from case1 where B like '%b%';
+------+------+
| a | B |
+------+------+
| 2 | bbb |
| 3 | BBB |
+------+------+
2 rows in set (0.00 sec)

指定Collation
mysql> select * from case1 where B like '%b%' collate utf8_bin;
 

+------+------+
| a | B |
+------+------+
| 2 | bbb |
+------+------+
1 row in set (0.01 sec)

通過binary把字符串轉化為二進制比較,由於大小寫字符的二進制肯定不同,因此也是區分大小的一種方式

mysql> select * from case1 where binary B like '%b%';
+------+------+
| a | B |
+------+------+
| 2 | bbb |
+------+------+
1 row in set (0.00 sec)

mysql>

最後要說明一點的是Collation與索引存儲的關系。因為Collation是用於字符串之間比較,而索引是基於比較有序排列的,因此Collation會影響記錄的索引順序

You May Also Like