1. 什么是字符集和校驗規則?
字符集是一套符號和編碼。校對規則是在字符集內用于比較字符的一套規則。任何一個給定的字符集至少有一個校對規則,它可能有幾個校對規則。要想列出一個字符集的校對規則,使用SHOW COLLATION語句。
校對規則一般有這些特征:
2. 不同級別的字符集和校驗規則可控制大小寫敏感
MySQL5.1在同一臺服務器、同一個數據庫或甚至在同一個表中使用不同字符集或校對規則來混合定義字符串。字符集和校對規則有4個級別的默認設置:服務器級、數據庫級、表級和連接級。
2.1服務器級
MySQL按照如下方法確定服務器字符集和服務器校對規則:
當啟動mysqld時,根據使用的初始選項設置來確定服務器字符集和校對規則。
shell> mysqld --default-character-set=latin1 --default-collation=latin1_swedish_ci
更改設定值的一個方法是通過重新編譯。如果希望在從源程序構建時更改默認服務器字符集和校對規則,使用:--with-charset和--with-collation作為configure的參量。例如:
shell> ./configure --with-charset=latin1 --with-collation=latin1_german1_ci
mysqld和configure都驗證字符集/校對規則組合是否有效。如果無效,每個程序都顯示一個錯誤信息,然后終止。
2.2數據庫級
MySQL這樣選擇數據庫字符集和數據庫校對規則:
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按照下面的方式選擇表字符集和 校對規則:
mysql> create database yutest2;Query OK, 1 row affected (0.01 sec)mysql> use yutest2;Database changedmysql> 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)
參考鏈接:
MySQL5.1參考手冊 第十章 字符集支持 https://dev.mysql.com/doc/refman/5.1/zh/charset.html#charset-collate
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com