字符集,排序規(guī)則,Unicode

序言

show character set;
--查看mysql支持的字符集,部分輸出如下
Character Describption Default collation Maxlen
ascii US ASCII ascii_general_ci 1
big5 Big5 Traditional Chinese(繁體中文) big5_chinese_ci 2
binary Binary pseudo charset binary 1
gb18030 China National Standard GB18030 gb18030_chinese_ci 4
gb2312 GB2312 Simplified Chinese gb2312_chinese_ci 2
gbk GBK Simplified Chinese gbk_chinese_ci 2
utf16 UTF-16 Unicode utf16_general_ci 4
utf16le UTF-16LE Unicode utf16le_general_ci 4
utf32 UTF-32 Unicode utf32_general_ci 4
utf8 UTF-8 Unicode utf8_general_ci 3
utf8mb4 UTF-8 Unicode utf8mb4_0900_ai_ci 4
show collation;
--查看mysql支持的collation

指定字符集與排序規(guī)則

服務(wù)器的字符集與排序規(guī)則

  • character_set_server的默認(rèn)值為utf8mb4

    show variables like 'character_set_server';
    --輸出的Value列為utf8mb4
    
  • my.ini中可以設(shè)置character_set_server的值:

    character-set-server=utf8;
    --在my.ini中添加上述行,重啟服務(wù),即可設(shè)置character_set_server的值
    
  • 在運(yùn)行過程中,可以更改character_set_server的值:

    set character_set_server = gbk;
    
  • 如果未在create database語(yǔ)句中指定字符集和排序規(guī)則,則會(huì)將character_set_servercollation_server作為默認(rèn)值

  • 若只指定了字符集沒有指定排序規(guī)則,則使用字符集對(duì)應(yīng)的默認(rèn)的排序規(guī)則

數(shù)據(jù)庫(kù)的字符集與排序規(guī)則

  • 可以在create databasealter database時(shí)指定字符集和排序規(guī)則

    create database d character set gbk collate gbk_bin;
    alter database d character set gb2312 collate gb2312_bin;
    
    use d;
    SELECT @@character_set_database, @@collation_database;
    --此sql語(yǔ)句用于輸出當(dāng)前數(shù)據(jù)庫(kù)的字符集與排序規(guī)則
    
  • 當(dāng)前數(shù)據(jù)庫(kù)的字符集和排序規(guī)則,可以通過查看character_set_databasecollation_database來確定。若當(dāng)前沒有默認(rèn)數(shù)據(jù)庫(kù),則character_set_databasecollation_databasecharacter_set_servercollation_server相同

    create database d0 character set gbk collate gbk_bin;
    create database d1 character set utf8 collate utf8_bin;
    
    use d0;
    show variables like 'character_set_database';
    --輸出的character_set_database值為gbk
    
    use d1;
    show variables like 'character_set_database';
    --輸出的character_set_database值為utf8
    
  • 數(shù)據(jù)庫(kù)的字符集和排序規(guī)則會(huì)產(chǎn)生以下影響:

    • create table未指定字符集和排序規(guī)則時(shí),則采用數(shù)據(jù)庫(kù)的字符集和排序規(guī)則

    • load data未指定字符集和排序規(guī)則,則使用數(shù)據(jù)庫(kù)的字符集來解釋文件中的信息

    • 創(chuàng)建的存儲(chǔ)過程和函數(shù)未指定字符集和排序規(guī)則,則使用數(shù)據(jù)庫(kù)的字符集和排序規(guī)則

      use d0; --create database d0 character set gbk collate gbk_bin;
      delimiter \
      
      create procedure p0(in str varchar(111))
      begin
              select charset(str);
      end\
      
      delimiter ;
      
      call p0("szn");
      --輸出:gbk
      
      use d1; --database d1 character set utf8 collate utf8_bin;
      delimiter \
      
      create procedure p1(in str varchar(111))
      begin
              select charset(str);
      end\
      
      delimiter ;
      
      call p1("szn");
      --輸出:utf8
      
      use d1; --database d1 character set utf8 collate utf8_bin;
      delimiter \
      
      create procedure p_set(in str varchar(111) character set gb2312)
      begin
              select charset(str);
      end\
      
      delimiter ;
      
      call p_set("szn");
      --輸出:gb2312
      

表的字符集與排序規(guī)則

  • 可以在create tablealter table時(shí)指定表的字符集和排序規(guī)則

    create table t0(name varchar(1024)) character set gbk collate gbk_bin;
    alter table t0 character set utf8;
    
  • 若未指定表的字符集和排序規(guī)則,則使用對(duì)應(yīng)數(shù)據(jù)庫(kù)的字符集和排序規(guī)則

  • 若表中的列未指定字符集和排序規(guī)則,則對(duì)應(yīng)的列使用表的字符集和排序規(guī)則

列的字符集與排序規(guī)則

  • create tablealter table時(shí)指定列的字符集和排序規(guī)則

    create table t2(name varchar(1024) character set gbk collate gbk_bin);
    alter table t2 modify column name varchar(1024) character set utf8 collate utf8_bin;
    
  • 使用alter table將列的字符集進(jìn)行更改時(shí),若字符集不兼容,則可能會(huì)丟失數(shù)據(jù)

字符串字面量的字符集與排序規(guī)則

  • 字符串字面量的默認(rèn)字符集和排序規(guī)則由character_set_connectioncollation_connection指定

  • 字符串字面量可以設(shè)定字符集與排序規(guī)則:

    show variables like 'character_set_connection';
    --輸出值:utf8
    
    set @b = "szn";
    select charset(@b);
    --輸出值:utf8
    
    set @c = _gbk"哈" COLLATE gbk_bin;
    --字符串字面量前指定編碼方式,這種方式稱為介紹器(Character Set Introducers)
    
    select charset(@c);
    --輸出值:gbk
    
  • 字符串字面量指定字符集并不會(huì)更改其值,解析器最終仍按照character_set_connection進(jìn)行處理

    set @c0 = _gbk"哈" COLLATE gbk_bin;
    set @c1 = _utf8"哈" COLLATE utf8_bin;
    select hex(@c0), hex(@c1);
    --兩個(gè)輸出均為"哈"的utf8編碼 E59388
    

Character Set Introducers

  • 字符串字面量,十六進(jìn)制字面量,位字面量都有一個(gè)可選的字符集和排序規(guī)則設(shè)置,這稱為介紹器

  • 介紹器告訴解析器后面字符串使用的字符集,但是不會(huì)改變字符串的值

    set @s0 = _utf8 0xE59388;
    set @s1 = _gbk 0xB9FE;
    set @s2 = _gbk X'B9FE';
    set @s3 = _utf8 b'111001011001001110001000';
    set @s4 = _utf8 0b111001011001001110001000;
    select @s0, @s1, @s2, @s3, @s4;
    --輸出:哈,哈,哈,哈, 哈
    
    SET @v1 = X'000D' | X'0BC0';
    --@V1是bigint類型
    
    SET @v2 = _binary X'000D' | X'0BC0';
    --@v2是字符串
    
    SELECT HEX(@v1), HEX(@v2);
    --輸出:BCD, 0BCD
    
    select @v1 + 1, @v2 + 1, "0BCD" + "1";.
    --輸出:3022, 1, 1
    

連接的字符集與排序規(guī)則

  • 每個(gè)客戶端的連接都有特定且可更改的字符集和排序規(guī)則

  • 客戶端發(fā)起sql查詢,至結(jié)果返回到客戶端:

    • character_set_client表明客戶端發(fā)送過來的sql語(yǔ)句的字符集
    • 服務(wù)器將接收到的sql語(yǔ)句的字符集轉(zhuǎn)換為character_set_connection
    • 服務(wù)器將sql的執(zhí)行結(jié)果的字符集轉(zhuǎn)換為character_set_results
  • character_set_client不允許一些字符集設(shè)置:

    ucs2
    utf16
    utf16le
    utf32
    
  • set character set會(huì)同時(shí)將character_set_clientcharacter_set_results設(shè)定為給定值,并且將character_set_connection設(shè)置為character_set_database的值

    set character_set_client = ascii;
    set character_set_results = big5;
    set character_set_database = gb2312;
    set character_set_connection = gbk;
    
    set character set latin2;
    show variables like 'character%';
    
    Variable_name Value
    character_set_client latin2
    character_set_connection gb2312
    character_set_database gb2312
    character_set_results latin2
  • my.ini中添加default-character-set=latin2,重啟服務(wù),將會(huì)同時(shí)更改character_set_client,character_set_connection,character_set_resultslatin2

  • 可以在登錄mysql時(shí):mysql -u root -p --default-character-set=latin1

  • set names gb2312;
    --等效于下面三句代碼
    
    set character_set_client = gb2312;
    set character_set_results = gb2312;
    set character_set_connection = gb2312;
    

Unicode支持

? The Unicode Standard includes characters from the Basic Multilingual(使用多種語(yǔ)言的) Plane (BMP) and supplementary(追加的) characters that lie outside the BMP.

? BMP characters have these characteristics:

  • Their code point values are between 0 and 65535 (or U+0000 and U+FFFF).
  • They can be encoded in a variable-length encoding using 8, 16, or 24 bits (1 to 3 bytes).
  • They can be encoded in a fixed-length encoding using 16 bits (2 bytes).
  • They are sufficient(充分的) for almost all characters in major(主要的) languages.

? Supplementary characters lie outside the BMP:

  • Their code point values are between U+10000 and U+10FFFF).
  • 占用的空間比BMP內(nèi)的字符大,最多占用4字節(jié)

mysql支持的unicode

字符集 單個(gè)字符占用空間 支持的字符 描述
utf8mb4 1到4字節(jié) BMP and supplementary A UTF-8 encoding of the Unicode character set
utf8mb3 1到3字節(jié) BMP only A UTF-8 encoding of the Unicode character set
utf8 1到3字節(jié) BMP only An alias for utf8mb3.
ucs2 2字節(jié) BMP and supplementary The UCS-2 encoding of the Unicode character set
utf16 2或4字節(jié) BMP and supplementary The UTF-16 encoding for the Unicode character set . Like ucs2 but with an extension for supplementary characters.
utf16le 2或4字節(jié) BMP and supplementary The UTF-16LE encoding for the Unicode character set. Like utf16 but little-endian rather than big-endian.
utf32 4字節(jié) BMP and supplementary The UTF-32 encoding for the Unicode character set
  • utf8當(dāng)前是utf8mb3的別稱,但是utf8mb3將在mysql將來的版本被刪除。有時(shí)候utf8會(huì)變成utf8mb4的別稱,所以為了避免模糊不清,請(qǐng)考慮使用utf8mb4

  • 對(duì)于BMP字符,utf8mb4utf8mb3具有相同編碼值,占用的空間也相同。即utf8mb4utf8mb3的超集

  • 對(duì)于補(bǔ)充字符,utf8mb4需要四個(gè)字節(jié)來存儲(chǔ)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評(píng)論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,423評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,678評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容