字符集登钥,排序規(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ī)則

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

  • character_set_server的默認值為utf8mb4

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

    character-set-server=utf8;
    --在my.ini中添加上述行牧牢,重啟服務,即可設置character_set_server的值
    
  • 在運行過程中姿锭,可以更改character_set_server的值:

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

  • 若只指定了字符集沒有指定排序規(guī)則,則使用字符集對應的默認的排序規(guī)則

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

  • 可以在create databasealter database時指定字符集和排序規(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語句用于輸出當前數(shù)據(jù)庫的字符集與排序規(guī)則
    
  • 當前數(shù)據(jù)庫的字符集和排序規(guī)則呻此,可以通過查看character_set_databasecollation_database來確定轮纫。若當前沒有默認數(shù)據(jù)庫,則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ù)庫的字符集和排序規(guī)則會產(chǎn)生以下影響:

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

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

    • 創(chuàng)建的存儲過程和函數(shù)未指定字符集和排序規(guī)則,則使用數(shù)據(jù)庫的字符集和排序規(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時指定表的字符集和排序規(guī)則

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

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

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

  • create tablealter table時指定列的字符集和排序規(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將列的字符集進行更改時,若字符集不兼容贝乎,則可能會丟失數(shù)據(jù)

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

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

  • 字符串字面量可以設定字符集與排序規(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
    
  • 字符串字面量指定字符集并不會更改其值,解析器最終仍按照character_set_connection進行處理

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

Character Set Introducers

  • 字符串字面量览效,十六進制字面量却舀,位字面量都有一個可選的字符集和排序規(guī)則設置,這稱為介紹器

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

    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ī)則

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

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

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

    ucs2
    utf16
    utf16le
    utf32
    
  • set character set會同時將character_set_clientcharacter_set_results設定為給定值,并且將character_set_connection設置為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,重啟服務术裸,將會同時更改character_set_client,character_set_connection,character_set_resultslatin2

  • 可以在登錄mysql時: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(使用多種語言的) 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

字符集 單個字符占用空間 支持的字符 描述
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當前是utf8mb3的別稱,但是utf8mb3將在mysql將來的版本被刪除袭艺。有時候utf8會變成utf8mb4的別稱搀崭,所以為了避免模糊不清,請考慮使用utf8mb4

  • 對于BMP字符猾编,utf8mb4utf8mb3具有相同編碼值瘤睹,占用的空間也相同。即utf8mb4utf8mb3的超集

  • 對于補充字符答倡,utf8mb4需要四個字節(jié)來存儲

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轰传,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘪撇,更是在濱河造成了極大的恐慌获茬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倔既,死亡現(xiàn)場離奇詭異锦茁,居然都是意外死亡,警方通過查閱死者的電腦和手機叉存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來度帮,“玉大人歼捏,你說我怎么就攤上這事”颗瘢” “怎么了瞳秽?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長率翅。 經(jīng)常有香客問我练俐,道長,這世上最難降的妖魔是什么冕臭? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任腺晾,我火速辦了婚禮,結果婚禮上辜贵,老公的妹妹穿的比我還像新娘悯蝉。我一直安慰自己,他們只是感情好托慨,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布鼻由。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蕉世。 梳的紋絲不亂的頭發(fā)上蔼紧,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音狠轻,去河邊找鬼奸例。 笑死,一個胖子當著我的面吹牛哈误,可吹牛的內(nèi)容都是我干的哩至。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜜自,長吁一口氣:“原來是場噩夢啊……” “哼菩貌!你這毒婦竟也來了?” 一聲冷哼從身側響起重荠,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箭阶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戈鲁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仇参,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年婆殿,在試婚紗的時候發(fā)現(xiàn)自己被綠了诈乒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡婆芦,死狀恐怖怕磨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情消约,我是刑警寧澤肠鲫,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站或粮,受9級特大地震影響导饲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氯材,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一渣锦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氢哮,春花似錦泡挺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贱除。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背共缕。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工竹挡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谚咬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親录语。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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