MYSQL查詢大小寫是否敏感問題分析

mysql數據庫在作查詢的時候,有時候是英文字母大小寫敏感的,有時候又不是的,主要是由mysql的字符校驗規則的設置決定的,一般默認是不支持的大小寫字母敏感的。mysql

 

 1. 什麼是字符集和校驗規則?sql

字符集是一套符號和編碼。校對規則是在字符集內用於比較字符的一套規則。任何一個給定的字符集至少有一個校對規則,它可能有幾個校對規則。要想列出一個字符集的校對規則,使用SHOW COLLATION語句。shell

1

校對規則通常有這些特徵:數據庫

  • 兩個不一樣的字符集不能有相同的校對規則。服務器

  • 每一個字符集有一個默認校對規則。例如,utf8默認校對規則是utf8_general_ci。ide

  • 存在校對規則命名約定:它們以其相關的字符集名開始,一般包括一個語言名,而且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束。函數

 

2. 不一樣級別的字符集和校驗規則可控制大小寫敏感測試

MySQL5.1在同一臺服務器、同一個數據庫或甚至在同一個表中使用不一樣字符集或校對規則來混合定義字符串。字符集和校對規則有4個級別的默認設置:服務器級、數據庫級、表級和鏈接級。編碼

2.1服務器級spa

MySQL按照以下方法肯定服務器字符集和服務器校對規則:

(1)修改配置文件/etc/my.cnf

在[mysqld]下添加:collation_server = utf8_bin

重啓實例

2

更改服務器級的校驗規則(collation_server )後,數據庫校驗規則(collation_collation)默認會繼承服務器級的。

注意:

這個只適用於在從新啓動以後, 新建的庫,已存在的庫不受影響.

一樣的, 即便庫的校驗規則改了,已經存在的表不受修改影響;

同理與已經存在的列…

mysql> create database yutest0;
Query OK, 1 row affected (0.00 sec)
mysql> use yutest0;
Database changed
mysql> create table t1 (name varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values('AAA');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values('aaa');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+
| name |
+------+
| AAA  |
| aaa  |
+------+
2 rows in set (0.00 sec)

mysql> select * from t1 where name='aaa';
+------+
| name |
+------+
| aaa  |
+------+
1 row in set (0.00 sec)

能夠看出,在服務器級進行相應的校對規則設置,查詢大小寫敏感。

(2)當服務器啓動時根據有效的選項設置

當啓動mysqld時,根據使用的初始選項設置來肯定服務器字符集和校對規則。

shell> mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci

2.2數據庫級

MySQL這樣選擇數據庫字符集和數據庫校對規則:

  • 若是指定了character set X和collate Y,那麼採用字符集X和校對規則Y。

  • 若是指定了character set X而沒有指定collate Y,那麼採用character set X和character set X的默認校對規則。

  • 不然,採用服務器字符集和服務器校對規則。

(1)修改配置文件/etc/my.cnf

進行了兩組測試:

1) 在[mysqld]下添加:

collation_server = utf8_bin

collation_database = utf8_bin

2) 在[mysqld]下添加:

collation_database = utf8_bin

重啓實例,兩組都不能正常啓動,錯誤信息以下:

3

可見,my.cnf配置文件中不支持設置collation_database 變量。

 

(2)建立數據庫時設置數據庫校驗規則

mysql> create database yutest default character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)
mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_bin        |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> select * from t1;
+------+
| name |
+------+
| ABC  |
| abc  |
+------+
2 rows in set (0.00 sec)

mysql> select * from t1 where name='abc';
+------+
| name |
+------+
| abc  |
+------+
1 row in set (0.01 sec)

能夠看出,在數據庫級進行相應的校對規則設置,查詢大小寫敏感。

 

2.3表級

MySQL按照下面的方式選擇表字符集和校對規則:

  • 若是指定了character set X和collate Y,那麼採用character set X和collate Y。

  • 若是指定了character set X而沒有指定collate Y,那麼採用character set X和character set X的默認校對規則。

  • 不然,採用數據庫字符集和服務器校對規則。

在建立表時設置表級校驗規則:

mysql> create database yutest2;
Query OK, 1 row affected (0.01 sec)
mysql> use yutest2;
Database changed

mysql> create table t1(name varchar(10))
    -> default character set utf8 collate utf8_bin;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values('ABC');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values('abc');
Query OK, 1 row affected (0.00 sec)

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.00 sec)

mysql> select * from t1;
+------+
| name |
+------+
| ABC  |
| abc  |
+------+
2 rows in set (0.00 sec)

mysql> select * from t1 where name='abc';
+------+
| name |
+------+
| abc  |
+------+
1 row in set (0.00 sec)

能夠看出,在表級進行相應的校對規則設置,查詢大小寫敏感。

 

2.4 鏈接級

考慮什麼是一個「鏈接」:它是鏈接服務器時所做的事情。客戶端發送SQL語句,例如查詢,經過鏈接發送到服務器。服務器經過鏈接發送響應給客戶端,例如結果集。對於客戶端鏈接,這樣會致使一些關於鏈接的字符集和校對規則的問題,這些問題均可以經過系統變量來解決:

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/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
  • 當查詢離開客戶端後,在查詢中使用哪一種字符集?

服務器使用character_set_client變量做爲客戶端發送的查詢中使用的字符集。

  • 服務器接收到查詢後應該轉換爲哪一種字符集?

轉換時,服務器使用character_set_connection和collation_connection系統變量。它將客戶端發送的查詢從character_set_client系統變量轉換到character_set_connection。

  • 服務器發送結果集或返回錯誤信息到客戶端以前應該轉換爲哪一種字符集?

character_set_results變量指示服務器返回查詢結果到客戶端使用的字符集。包括結果數據,例如列值和結果元數據(如列名)。

3. 建立數據庫表時大小寫不敏感,仍然有方法在查詢時區分大小寫

3.1 在SQL語句中使用collate

使用collate子句,可以爲一個比較覆蓋任何默認校對規則。collate能夠用於多種SQL語句中,好比where,having,group by,order by,as,聚合函數。

mysql> select * from t1 where name collate utf8_bin = 'ABC';
+------+
| name |
+------+
| ABC |
+------+
1 row in set (0.00 sec)

mysql> select * from t1 where name = 'ABC';
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)

mysql> select * from t1;
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)

3.2 binary操做符

binary操做符是collate子句的一個速記符。binary ’x‘等價與’x‘ collate y,這裏y是字符集’x‘二元校對規則的名字。每個字符集有一個二元校對規則。例如,latin1字符集的二元校對規則是latin1_bin,所以,若是列a是字符集latin1,如下兩個語句有相同效果:

select * from t1 order by binary a;

select * from t1 order by a collate latin1_bin;
mysql> select * from t1 where binary name = 'ABC';
+------+
| name |
+------+
| ABC |
+------+
1 row in set (0.00 sec)
mysql>
mysql> select * from t1 where name = 'ABC';
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)

文章來源:http://blog.aliyun.com/538

相關文章
相關標籤/搜索