程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 深刻Mysql字符集設置剖析

深刻Mysql字符集設置剖析

編輯:MySQL綜合教程

深刻Mysql字符集設置剖析。本站提示廣大學習愛好者:(深刻Mysql字符集設置剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻Mysql字符集設置剖析正文


根本概念
• 字符(Character)是指人類說話中最小的表義符號。例如'A'、'B'等;
• 給定一系列字符,對每一個字符付與一個數值,用數值來代表對應的字符,這一數值就是字符的編碼(Encoding)。例如,我們給字符'A'付與數值0,給字符'B'付與數值1,則0就是字符'A'的編碼;
• 給定一系列字符並付與對應的編碼後,一切這些字符和編碼對構成的聚集就是字符集(Character Set)。例如,給定字符列表為{'A','B'}時,{'A'=>0, 'B'=>1}就是一個字符集;
• 字符序(Collation)是指在統一字符集內字符之間的比擬規矩;
• 肯定字符序後,能力在一個字符集上界說甚麼是等價的字符,和字符之間的年夜小關系;
• 每一個字符序獨一對應一種字符集,但一個字符集可以對應多種字符序,個中有一個是默許字符序(Default Collation);
• MySQL中的字符序稱號服從定名通例:以字符序對應的字符集稱號開首;以_ci(表現年夜小寫不敏感)、_cs(表現年夜小寫敏感)或_bin(表現按編碼值比擬)開頭。例如:在字符序``utf8_general_ci''下,字符``a''和``A''是等價的;
MySQL字符集設置
• 體系變量:
– character_set_server:默許的外部操作字符集
– character_set_client:客戶端起源數據應用的字符集
– character_set_connection:銜接層字符集
– character_set_results:查詢成果字符集
– character_set_database:以後選中數據庫的默許字符集
– character_set_system:體系元數據(字段名等)字符集
– 還有以collation_開首的同下面對應的變量,用來描寫字符序。
• 用introducer指定文本字符串的字符集:
– 格局為:[_charset] 'string' [COLLATE collation]
– 例如:
• SELECT _latin1 'string';
• SELECT _utf8 '你好' COLLATE utf8_general_ci;
– 由introducer潤飾的文本字符串在要求進程中不經由過剩的轉碼,直接轉換為外部字符集處置。
MySQL中的字符集轉換進程
1. MySQL Server收到要求時將要求數據從character_set_client轉換為character_set_connection;
2. 停止外部操作前將要求數據從character_set_connection轉換為外部操作字符集,其肯定辦法以下:
• 應用每一個數據字段的CHARACTER SET設定值;
• 若上述值不存在,則應用對應數據表的DEFAULT CHARACTER SET設定值(MySQL擴大,非SQL尺度);
• 若上述值不存在,則應用對應數據庫的DEFAULT CHARACTER SET設定值;
• 若上述值不存在,則應用character_set_server設定值。
3. 將操作成果從外部操作字符集轉換為character_set_results。

 
罕見成績解析
• 向默許字符集為utf8的數據表拔出utf8編碼的數據前沒有設置銜接字符集,查詢時設置銜接字符集為utf8

– 拔出時依據MySQL辦事器的默許設置,character_set_client、character_set_connection和character_set_results均為latin1;

– 拔出操作的數據將經由latin1=>latin1=>utf8的字符集轉換進程,這一進程中每一個拔出的漢字都邑從原始的3個字節釀成6個字節保留;

– 查詢時的成果將經由utf8=>utf8的字符集轉換進程,將保留的6個字節原封不動前往,發生亂碼……

 

• 向默許字符集為latin1的數據表拔出utf8編碼的數據前設置了銜接字符集為utf8

– 拔出時依據銜接字符集設置,character_set_client、character_set_connection和character_set_results均為utf8;

– 拔出數據將經由utf8=>utf8=>latin1的字符集轉換,若原始數據中含有/u0000~/u00ff規模之外的Unicode字符,會由於沒法在latin1字符集中表現而被轉換為“?”(0x3F)符號,今後查詢時不論銜接字符集設置若何都沒法恢復其內容了。

 

檢拆字符集成績的一些手腕
• SHOW CHARACTER SET;

• SHOW COLLATION;

• SHOW VARIABLES LIKE 'character%';

• SHOW VARIABLES LIKE 'collation%';

• SQL函數HEX、LENGTH、CHAR_LENGTH

• SQL函數CHARSET、COLLATION

應用MySQL字符集時的建議
• 樹立數據庫/表和停止數據庫操作時盡可能顯式指出應用的字符集,而不是依附於MySQL的默許設置,不然MySQL進級時能夠帶來很年夜困擾;

• 數據庫和銜接字符集都應用latin1時固然年夜部門情形下都可以處理亂碼成績,但缺陷是沒法以字符為單元來停止SQL操作,普通情形下將數據庫和銜接字符集都置為utf8是較好的選擇;

• 應用mysql C API時,初始化數據庫句柄後立時用mysql_options設定MYSQL_SET_CHARSET_NAME屬性為utf8,如許就不消顯式地用SET NAMES語句指定銜接字符集,且用mysql_ping重連斷開的長銜接時也會把銜接字符集重置為utf8;

• 關於mysql PHP API,普通頁面級的PHP法式總運轉時光較短,在銜接到數據庫今後顯式用SET NAMES語句設置一次銜接字符集便可;但當應用長銜接時,請留意堅持銜接通行並在斷開重連後用SET NAMES語句顯式重置銜接字符集。

其他留意事項
• my.cnf中的default_character_set設置只影響mysql敕令銜接辦事器時的銜接字符集,不會對應用libmysqlclient庫的運用法式發生任何感化!

• 對字段停止的SQL函數操作平日都是之內部操作字符集停止的,不受銜接字符集設置的影響。

• SQL語句中的裸字符串會遭到銜接字符集或introducer設置的影響,關於比擬之類的操作能夠發生完整分歧的成果,須要當心!
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved