MySQL字符集及校對規則的理解

閱讀目錄:MySQL的字符集和校對規則
mysql

1、字符集(Character set)sql

  是多個字符(英文字符,漢字字符,或者其餘國家語言字符)的集合,字符集種類較多,每一個字符集包含的字符個數不一樣。數據庫

特色:windows

  ①字符編碼方式是用一個或多個字節表示字符集中的一個字符服務器

  ②每種字符集都有本身特有的編碼方式,所以同一個字符,在不一樣字符集的編碼方式下,會產生不一樣的二進制工具

常見字符集:ui

  ASCII字符集:基於羅馬字母表的一套字符集,它採用1個字節的低7位表示字符,高位始終爲0。編碼

  LATIN1字符集:相對於ASCII字符集作了擴展,仍然使用一個字節表示字符,但啓用了高位,擴展了字符集的表示範圍。spa

  GBK字符集:支持中文,字符有一字節編碼和兩字節編碼方式。3d

  UTF8字符集:Unicode字符集的一種,是計算機科學領域裏的一項業界標準,支持了全部國家的文字字符,utf8採用1-4個字節表示字符。

一、MySQL與字符集

  只要涉及到文字的地方,就會存在字符集和編碼方式。MySQL系統變量值:

 

二、正確使用字符集

  數據庫服務端的字符集具體要看存儲什麼字符

以上這些參數如何起做用:

1.庫、表、列字符集的由來

  ①建庫時,若未明確指定字符集,則採用character_set_server指定的字符集。

  ②建表時,若未明確指定字符集,則採用當前庫所採用的字符集。

  ③新增時,修改表字段時,若未明確指定字符集,則採用當前表所採用的字符集。

2.更新、查詢涉及到得字符集變量

  更新流程字符集轉換過程:character_set_client-->character_set_connection-->表字符集。

  查詢流程字符集轉換過程:表字符集-->character_set_result

3.character_set_database

  當前默認數據庫的字符集,好比執行use xxx後,當前數據庫變爲xxx,若xxx的字符集爲utf8,那麼此變量值就變爲utf8(供系統設置,無需人工設置)。

三、MySQL客戶端與字符集

1.對於輸入來講:

  客戶端使用的字符集必須經過character_set_client、character_set_connection體現出來:

    ①在客戶端對數據進行編碼(Linux:utf八、windows:gbk)

    ②MySQL接到SQL語句後(好比insert),發現有字符,詢問客戶端經過什麼方式對字符編碼:客戶端經過character_set_client參數告知MySQL客戶端的編碼方式(因此此參數須要正確反映客戶端對應的編碼)

    ③當MySQL發現客戶端的client所傳輸的字符集與本身的connection不同時,會將client的字符集轉換爲connection的字符集

    ④MySQL將轉換後的編碼存儲到MySQL表的列上,在存儲的時候再判斷編碼是否與內部存儲字符集(按照優先級判斷字符集類型)上的編碼一致,若是不一致須要再次轉換

2.對於查詢來講:

  客戶端使用的字符集必須經過character_set_results來體現,服務器詢問客戶端字符集,經過character_set_results將結果轉換爲與客戶端相同的字符集傳遞給客戶端。(character_set_results默認等於character_set_client)

四、MySQL字符編碼轉換原理:

  問:若character_set_client爲UTF8,而character_set_database爲GBK,則會出現須要進行編碼轉換的狀況,字符集轉換的原理是什麼?

  答:假設gbk字符集的字符串「你好」,須要轉爲utf8字符集存儲,實際就是對於「你好」字符串中的每一個漢字去utf8編碼表裏面查詢對應的二進制,而後存儲。

 

圖解字符集轉換過程:

  ①MySQL Server收到請求時將請求數據從character_set_client轉換爲character_set_connection;

  ②進行內部操做前將請求數據從character_set_connection轉換爲內部操做字符集

肯定步驟:

--使用每一個數據字段的CHARACTER SET設定值;

--若上述值不存在,則使用對應數據表的DEFAULT CHARACTER SET設定值;

--若上述值不存在,則使用對應數據庫的DEFAULT CHARACTER SET設定值;

--若上述值不存在,則使用character_set_server設定值;

  ③將操做結果從內部操做字符集轉換爲character_set_results

五、字符集常見處理操做

1.查看字符集編碼設置

  mysql> show variables like '%character%';

2.設置字符集編碼

  mysql> set names 'utf8';

至關於同時:

  set character_set_client = utf8;

  set character_set_results = utf8;

  set character_set_connection = utf8;

3.修改數據庫字符集

  mysql> alter database database_name character set xxx;

只修改庫的字符集,影響後續建立的表的默認定義;對於已建立的表的字符集不受影響。(通常在數據庫實現字符集便可,表和列都默認採用數據庫的字符集

4.修改表的字符集

  mysql> alter table table_name character set xxx;

只修改表的字符集,影響後續該表新增列的默認定義,已有列的字符集不受影響。

  mysql> alter table table_name convert to character set xxx;

同時修改表字符集和已有列字符集,並將已有數據進行字符集編碼轉換。

5.修改列字符集

格式:

ALTER TABLE table_name MODIFY

column_name {CHAR | VARCHAR | TEXT} (column_length)

    [CHARACTER SET charset_name]

    [COLLATE collation_name]

mysql> alter table table_name modify col_name varchar(col_length) character set xxx;

六、字符集的正確實踐:

MySQL軟件工具自己是沒有字符集的,主要是由於工具所在的OS的字符集(Windows:gbk、Linux:utf8),因此字符集的正確實踐很是重要:

  1.對於insert來講,character_set_client、character_set_connection相同,並且正確反映客戶端使用的字符集

  2.對於select來講,character_set_results正確反映客戶端字符集

  3.數據庫字符集取決於咱們要存儲的字符類型

  4.字符集轉換最多發生一次,這就要求character_set_client、character_set_connection相同

  5.全部的字符集轉換都發生在數據庫端

綜述:

  一、創建數據庫的時候注意字符集(gbk、utf8)

  二、鏈接數據庫之後,不管是執行dml仍是select,只要涉及到varchar、char列,就須要設置正確的字符集參數

 

2、校對規則collation校對

  字符集是一套符號和對應的編號

查看數據庫支持的全部字符集(charset):

mysql> show character set;

校對規則(collation):

  是在字符集內用於字符比較和排序的一套規則,好比有的規則區分大小寫,有的則無視。

mysql> create table t1(id int,name varchar(20));    #t1建表沒有指定校對規則

 mysql> show collation;  #查看數據庫支持的全部校對規則

mysql> show variables like 'collation_%';  #查看當前字符集和校對規則設置

校對規則特徵:

  ①兩個不一樣的字符集不能有相同的校對規則

  ②每一個字符集有一個默認校對規則;

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

注意:

  系統使用utf8字符集,若使用utf8_bin校對規則執行SQL查詢時區分大小寫,使用utf8_general_ci不區分大小寫(默認的utf8字符集對應的校對規則是utf8_general_ci)。

示例:

mysql> create table t2(id int,name varchar(20)) character set=gbk collate=gbk_bin;    #t2建表指定校對規則(區分大小寫)

相關文章
相關標籤/搜索