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

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

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

MySQL的字符集

MySQL與字符集

正確使用字符集

MySQL客戶端與字符集

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

字符集常見(jiàn)處理操作

字符集的正確實(shí)踐

MySQL的校對(duì)規(guī)則

一煎饼、字符集(Character set)

  是多個(gè)字符(英文字符,漢字字符十气,或者其他國(guó)家語(yǔ)言字符)的集合鹉勒,字符集種類較多啊鸭,每個(gè)字符集包含的字符個(gè)數(shù)不同恬试。

特點(diǎn):

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

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

常見(jiàn)字符集:

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

LATIN1字符集:相對(duì)于ASCII字符集做了擴(kuò)展燎含,仍然使用一個(gè)字節(jié)表示字符宾濒,但啟用了高位,擴(kuò)展了字符集的表示范圍屏箍。

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

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

1榄棵、MySQL與字符集

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

2疹鳄、正確使用字符集

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

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

1.庫(kù)、表芦岂、列字符集的由來(lái)

 ”窆①建庫(kù)時(shí),若未明確指定字符集禽最,則采用character_set_server指定的字符集腺怯。

  ②建表時(shí)弛随,若未明確指定字符集瓢喉,則采用當(dāng)前庫(kù)所采用的字符集宁赤。

 ∫ㄍ浮③新增時(shí),修改表字段時(shí)决左,若未明確指定字符集愕够,則采用當(dāng)前表所采用的字符集。

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

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

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

3.character_set_database

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

3凯亮、MySQL客戶端與字符集

1.對(duì)于輸入來(lái)說(shuō):

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

   『宥①在客戶端對(duì)數(shù)據(jù)進(jìn)行編碼(Linux:utf8假消、windows:gbk)

    ②MySQL接到SQL語(yǔ)句后(比如insert)岭接,發(fā)現(xiàn)有字符富拗,詢問(wèn)客戶端通過(guò)什么方式對(duì)字符編碼:客戶端通過(guò)character_set_client參數(shù)告知MySQL客戶端的編碼方式(所以此參數(shù)需要正確反映客戶端對(duì)應(yīng)的編碼)

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

   】谢Α④MySQL將轉(zhuǎn)換后的編碼存儲(chǔ)到MySQL表的列上,在存儲(chǔ)的時(shí)候再判斷編碼是否與內(nèi)部存儲(chǔ)字符集(按照優(yōu)先級(jí)判斷字符集類型)上的編碼一致窄锅,如果不一致需要再次轉(zhuǎn)換

2.對(duì)于查詢來(lái)說(shuō):

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

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

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

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

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

①M(fèi)ySQL Server收到請(qǐng)求時(shí)將請(qǐng)求數(shù)據(jù)從character_set_client轉(zhuǎn)換為character_set_connection;

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

確定步驟:

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

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

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

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

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

5否副、字符集常見(jiàn)處理操作

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

  mysql> show variables like '%character%';

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

mysql>?set names 'utf8';

相當(dāng)于同時(shí):

  set character_set_client = utf8;

  set character_set_results = utf8;

  set character_set_connection = utf8;

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

  mysql> alter database database_name character set xxx;

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

4.修改表的字符集

  mysql> alter table table_name character set xxx奈揍;

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

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

同時(shí)修改表字符集和已有列字符集,并將已有數(shù)據(jù)進(jìn)行字符集編碼轉(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奏篙、字符集的正確實(shí)踐:

MySQL軟件工具本身是沒(méi)有字符集的,主要是因?yàn)楣ぞ咚诘腛S的字符集(Windows:gbk迫淹、Linux:utf8)秘通,所以字符集的正確實(shí)踐非常重要:

  1.對(duì)于insert來(lái)說(shuō),character_set_client敛熬、character_set_connection相同肺稀,而且正確反映客戶端使用的字符集

  2.對(duì)于select來(lái)說(shuō),character_set_results正確反映客戶端字符集

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

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

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

綜述:

1、建立數(shù)據(jù)庫(kù)的時(shí)候注意字符集(gbk诲锹、utf8)繁仁;

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


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

  字符集是一套符號(hào)和對(duì)應(yīng)的編號(hào)

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

mysql> show character set;

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

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

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

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

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

校對(duì)規(guī)則特征:

①兩個(gè)不同的字符集不能有相同的校對(duì)規(guī)則钠四;

 〉涟恰②每個(gè)字符集有一個(gè)默認(rèn)校對(duì)規(guī)則;

③存在校對(duì)規(guī)則命名約定:以其相關(guān)的字符集名開(kāi)始形导,中間包括一個(gè)語(yǔ)言名环疼,并且以_ci(大小寫(xiě)不敏感)、_cs(大小寫(xiě)敏感)或_bin(二元)結(jié)束朵耕。

注意:

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

示例:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子处嫌,更是在濱河造成了極大的恐慌栅贴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熏迹,死亡現(xiàn)場(chǎng)離奇詭異檐薯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)注暗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)坛缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捆昏,你說(shuō)我怎么就攤上這事赚楚。” “怎么了骗卜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵宠页,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我寇仓,道長(zhǎng)举户,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任遍烦,我火速辦了婚禮敛摘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乳愉。我一直安慰自己兄淫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布蔓姚。 她就那樣靜靜地躺著捕虽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坡脐。 梳的紋絲不亂的頭發(fā)上泄私,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音备闲,去河邊找鬼晌端。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恬砂,可吹牛的內(nèi)容都是我干的咧纠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泻骤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漆羔!你這毒婦竟也來(lái)了梧奢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤演痒,失蹤者是張志新(化名)和其女友劉穎亲轨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸟顺,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡每辟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年溺拱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捞高。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砌函。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖端姚,靈堂內(nèi)的尸體忽然破棺而出晕粪,到底是詐尸還是另有隱情,我是刑警寧澤渐裸,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布巫湘,位于F島的核電站,受9級(jí)特大地震影響昏鹃,放射性物質(zhì)發(fā)生泄漏尚氛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一洞渤、第九天 我趴在偏房一處隱蔽的房頂上張望阅嘶。 院中可真熱鬧,春花似錦载迄、人聲如沸讯柔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)魂迄。三九已至,卻和暖如春惋耙,著一層夾襖步出監(jiān)牢的瞬間捣炬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工绽榛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湿酸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓灭美,卻偏偏與公主長(zhǎng)得像推溃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冲粤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345