字符集與校對規(guī)則

MySQL字符集及校對規(guī)則的理解

閱讀目錄:MySQL的字符集和校對規(guī)則

MySQL的字符集

MySQL與字符集

正確使用字符集

MySQL客戶端與字符集

字符集編碼轉(zhuǎn)換原理

字符集常見處理操作

字符集的正確實踐

MySQL的校對規(guī)則

一、字符集(Character set)

  是多個字符(英文字符,漢字字符,或者其他國家語言字符)的集合,字符集種類較多,每個字符集包含的字符個數(shù)不同。

特點:

①字符編碼方式是用一個或多個字節(jié)表示字符集中的一個字符

②每種字符集都有自己特有的編碼方式,因此同一個字符,在不同字符集的編碼方式下,會產(chǎn)生不同的二進制

常見字符集:

ASCII字符集:基于羅馬字母表的一套字符集,它采用1個字節(jié)的低7位表示字符,高位始終為0。

LATIN1字符集:相對于ASCII字符集做了擴展,仍然使用一個字節(jié)表示字符,但啟用了高位,擴展了字符集的表示范圍。

GBK字符集:支持中文,字符有一字節(jié)編碼和兩字節(jié)編碼方式。

UTF8字符集:Unicode字符集的一種,是計算機科學(xué)領(lǐng)域里的一項業(yè)界標(biāo)準(zhǔn),支持了所有國家的文字字符,utf8采用1-4個字節(jié)表示字符。

1、MySQL與字符集

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

2、正確使用字符集

數(shù)據(jù)庫服務(wù)端的字符集具體要看存儲什么字符

以上這些參數(shù)如何起作用:

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

 ?、俳◣鞎r,若未明確指定字符集,則采用character_set_server指定的字符集。

  ②建表時,若未明確指定字符集,則采用當(dāng)前庫所采用的字符集。

 ?、坌略鰰r,修改表字段時,若未明確指定字符集,則采用當(dāng)前表所采用的字符集。

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

  更新流程字符集轉(zhuǎn)換過程:character_set_client-->character_set_connection-->表字符集。

  查詢流程字符集轉(zhuǎn)換過程:表字符集-->character_set_result

3.character_set_database

  當(dāng)前默認(rèn)數(shù)據(jù)庫的字符集,比如執(zhí)行use xxx后,當(dāng)前數(shù)據(jù)庫變?yōu)閤xx,若xxx的字符集為utf8,那么此變量值就變?yōu)閡tf8(供系統(tǒng)設(shè)置,無需人工設(shè)置)。

3、MySQL客戶端與字符集

1.對于輸入來說:

客戶端使用的字符集必須通過character_set_client、character_set_connection體現(xiàn)出來:

   ?、僭诳蛻舳藢?shù)據(jù)進行編碼(Linux:utf8、windows:gbk)

   ?、贛ySQL接到SQL語句后(比如insert),發(fā)現(xiàn)有字符,詢問客戶端通過什么方式對字符編碼:客戶端通過character_set_client參數(shù)告知MySQL客戶端的編碼方式(所以此參數(shù)需要正確反映客戶端對應(yīng)的編碼)

   ?、郛?dāng)MySQL發(fā)現(xiàn)客戶端的client所傳輸?shù)淖址c自己的connection不一樣時,會將client的字符集轉(zhuǎn)換為connection的字符集

   ?、躆ySQL將轉(zhuǎn)換后的編碼存儲到MySQL表的列上,在存儲的時候再判斷編碼是否與內(nèi)部存儲字符集(按照優(yōu)先級判斷字符集類型)上的編碼一致,如果不一致需要再次轉(zhuǎn)換

2.對于查詢來說:

客戶端使用的字符集必須通過character_set_results來體現(xiàn),服務(wù)器詢問客戶端字符集,通過character_set_results將結(jié)果轉(zhuǎn)換為與客戶端相同的字符集傳遞給客戶端。(character_set_results默認(rèn)等于character_set_client)

4、MySQL字符編碼轉(zhuǎn)換原理:

  問:若character_set_client為UTF8,而character_set_database為GBK,則會出現(xiàn)需要進行編碼轉(zhuǎn)換的情況,字符集轉(zhuǎn)換的原理是什么?

  答:假設(shè)gbk字符集的字符串“你好”,需要轉(zhuǎn)為utf8字符集存儲,實際就是對于“你好”字符串中的每個漢字去utf8編碼表里面查詢對應(yīng)的二進制,然后存儲。

圖解字符集轉(zhuǎn)換過程:

①MySQL Server收到請求時將請求數(shù)據(jù)從character_set_client轉(zhuǎn)換為character_set_connection;

②進行內(nèi)部操作前將請求數(shù)據(jù)從character_set_connection轉(zhuǎn)換為內(nèi)部操作字符集

確定步驟:

--使用每個數(shù)據(jù)字段的CHARACTER SET設(shè)定值;

--若上述值不存在,則使用對應(yīng)數(shù)據(jù)表的DEFAULT CHARACTER SET設(shè)定值;

--若上述值不存在,則使用對應(yīng)數(shù)據(jù)庫的DEFAULT CHARACTER SET設(shè)定值;

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

③將操作結(jié)果從內(nèi)部操作字符集轉(zhuǎn)換為character_set_results。

5、字符集常見處理操作

1.查看字符集編碼設(shè)置

  mysql> show variables like '%character%';

2.設(shè)置字符集編碼

mysql>?set names 'utf8';

相當(dāng)于同時:

  set character_set_client = utf8;

  set character_set_results = utf8;

  set character_set_connection = utf8;

3.修改數(shù)據(jù)庫字符集

  mysql> alter database database_name character set xxx;

只修改庫的字符集,影響后續(xù)創(chuàng)建的表的默認(rèn)定義;對于已創(chuàng)建的表的字符集不受影響。(一般在數(shù)據(jù)庫實現(xiàn)字符集即可,表和列都默認(rèn)采用數(shù)據(jù)庫的字符集)

4.修改表的字符集

  mysql> alter table table_name character set xxx;

只修改表的字符集,影響后續(xù)該表新增列的默認(rèn)定義,已有列的字符集不受影響。

mysql> alter table table_name?convert to?character set xxx;

同時修改表字符集和已有列字符集,并將已有數(shù)據(jù)進行字符集編碼轉(zhuǎn)換。

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;

6、字符集的正確實踐:

MySQL軟件工具本身是沒有字符集的,主要是因為工具所在的OS的字符集(Windows:gbk、Linux:utf8),所以字符集的正確實踐非常重要:

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

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

  3.數(shù)據(jù)庫字符集取決于我們要存儲的字符類型

  4.字符集轉(zhuǎn)換最多發(fā)生一次,這就要求character_set_client、character_set_connection相同

  5.所有的字符集轉(zhuǎn)換都發(fā)生在數(shù)據(jù)庫端

綜述:

1、建立數(shù)據(jù)庫的時候注意字符集(gbk、utf8);

2、連接數(shù)據(jù)庫以后,無論是執(zhí)行dml還是select,只要涉及到varchar、char列,就需要設(shè)置正確的字符集參數(shù)。


二、校對規(guī)則collation校對

  字符集是一套符號和對應(yīng)的編號

查看數(shù)據(jù)庫支持的所有字符集(charset):

mysql> show character set;

校對規(guī)則(collation):

是在字符集內(nèi)用于字符比較和排序的一套規(guī)則,比如有的規(guī)則區(qū)分大小寫,有的則無視。

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

mysql>?show collation;?#查看數(shù)據(jù)庫支持的所有校對規(guī)則

mysql>?show variables like 'collation_%';??#查看當(dāng)前字符集和校對規(guī)則設(shè)置

校對規(guī)則特征:

①兩個不同的字符集不能有相同的校對規(guī)則;

 ?、诿總€字符集有一個默認(rèn)校對規(guī)則;

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

注意:

系統(tǒng)使用utf8字符集,若使用utf8_bin校對規(guī)則執(zhí)行SQL查詢時區(qū)分大小寫,使用utf8_general_ci不區(qū)分大小寫(默認(rèn)的utf8字符集對應(yīng)的校對規(guī)則是utf8_general_ci)。

示例:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容