MySQL數據記錄大小寫敏感問題【轉】


MySQL大小寫敏感

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

1.和數據庫名字、表名字、存儲過程和觸發器有關

 

為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

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會影響記錄的索引順序

 

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

 

以上文章轉自

Mysql大小寫敏感 - 冰刀(skate) - 博客頻道 - CSDN.NET
http://blog.csdn.net/wyzxg/article/details/44236259

 ===========================================================================================================

Mysql中字段大小寫敏感問題 - 豬先森 - 博客頻道 - CSDN.NET
http://blog.csdn.net/Del_Zhu/article/details/49998935

MySQL中大小寫敏感問題經常會帶來很多問題: 
比如說: 
select * from test 和 SELECT * FROM TEST 是無差別的。這個還好理解,但是如果遇到下面這樣的情況:

select * from test where name = 'del' 和 select * from test where name='DEL' 無差別

那就很可怕了!!

解決方法

這是什么原因呢?原來是因為MySQL中字符編碼導致的。簡單的說:

utf-8_bin 
以二進制值進行比較,也就是區分大小寫 
uft-8_general_ci 
一般比較,不區分大小寫 ‘A’=’a’collation:校對 
摘自: mysql中的collation什么意思 其中的utf8-bin

所以才會發生上面那種這么奇怪的問題!

另外,網上也有說添加binary關鍵字進行字段修飾的解決方法:

alter table test modify name binary;

其實本質上也是把collatioin(校對)模式改成二進制校對,實現大小寫敏感。

相關閱讀:http://dev.mysql.com/doc/search/?q=collation

 


免責聲明!

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



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