



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、MYSQL編碼問(wèn)題一原理篇) e F8 |* a* u6 d) iMysql的字符集里有兩個(gè)概念,一個(gè)是“Character set(字符集)”,另一個(gè)是“Collations”。$ y+ x+ D( . 2 R( B% I* Q- l1. Collations. D, G( a7 p; w% ? o, Collations翻成中文是“校驗(yàn)”,在網(wǎng)頁(yè)開(kāi)發(fā)的過(guò)程中,這個(gè)詞匯,只在Mysql里使用,主要作用是指導(dǎo)Mysql對(duì)字符的比較,比如, ASCII字符集里,Collations規(guī)定了a小于b,a等于a,以及a是否等于A(yíng)之類(lèi)的。通常,大家基本可以忽略Collations的存在,因?yàn)槊總€(gè)字符集都
2、有一個(gè)默認(rèn)的Collations,通常,使用默認(rèn)的Collations就可以了。 ?$ F+ t+ P D( G, Y% 2.字符集) : M1 ?1 k) U與這對(duì)比的是,字符集是個(gè)更廣的概念,即使是Windows下普通的文本文件,也滲及到字符集的問(wèn)題。不同的字符集,規(guī)定了不同的字符的編碼方式。一個(gè) character set (字符集)是一組符號(hào)和編碼,比如,ASCII字符集,包括的字符有:數(shù)字,大小寫(xiě)字母,分號(hào)、換行之類(lèi)的符號(hào),編碼方式是用一個(gè)7bit表示一個(gè)字符(A的編碼是65,b的編碼是98)。ASCII只規(guī)定了英文字母的編碼,非英文語(yǔ)言不能用ASCII編碼表示,為此,不同的國(guó)家,都
3、為自己的語(yǔ)言做了編碼,比如,我們國(guó)家,就有GB2312編碼。但每個(gè)國(guó)家之間的編碼不同,也存在著一些跨平臺(tái)的問(wèn)題,為此,一些國(guó)際化標(biāo)準(zhǔn)組織,就制定了一些國(guó)際通用的編碼,最常用的就是UTF8了。ASCII只對(duì)英文符號(hào)和英文字母做了編碼,GB2312對(duì)英文符號(hào),英文字母,漢字做了編碼,UTF8對(duì)世界上所有的語(yǔ)言文字做了編碼,所以,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。由此可見(jiàn),UTF8是所含最廣字符的字符集,所以,在一些多語(yǔ)言的WEB系統(tǒng)中,一般用UTF8字符集(PHPMyAdmin使用UTF8編碼)。* o1 H- M8 V3 t6 k+ c* c4 o) i%
4、l7 任何文本的存儲(chǔ),都滲及到字符集的概念。包括數(shù)據(jù)庫(kù),也包括普通的文本文件。/ q# n3 O: Y# b: I+ K1 W主要術(shù)語(yǔ):3 d7 r6 E* i+ u& C8 k: Q2 J* p字符:漢字,英文字母,標(biāo)點(diǎn)符號(hào),拉丁文等等。( D2 j- k, c7 n7 S |) D, d0 v編碼:將字符轉(zhuǎn)換成計(jì)算機(jī)存儲(chǔ)的格式,比如,A用65表示。. u& 7 x0 5 G+ h; Z& B字符集:一組字符以及對(duì)應(yīng)的編碼方式。! n! _ W 9 & ya. Mysql的字符集5 _1 s V1 p% qMysql目前支持多字符集,并且,支持在不同的字符集之間轉(zhuǎn)換(便于移植和支持多語(yǔ)言)。
5、. a) M/ , I8 cMysql可以設(shè)置服務(wù)器級(jí)字符集、數(shù)據(jù)庫(kù)級(jí)字符集、數(shù)據(jù)表級(jí)字符集、表列的字符集,實(shí)際上,最終使用字符集的地方是存儲(chǔ)字符的列,比如,你設(shè)置 table1中col1列是字符類(lèi)型,col1才用到了字符集,如果table1表的col2列是int類(lèi)型,col2不使用字符集的概念。3 & b z7 b% v1 o$ 服務(wù)器級(jí)字符集、數(shù)據(jù)庫(kù)級(jí)字符集、數(shù)據(jù)表級(jí)字符集都是為列的字符集做默認(rèn)選項(xiàng)的。. z* E* e! o( TMysql一定有一個(gè)字符集,可以通過(guò)啟動(dòng)時(shí)加參數(shù)指定,也可以編譯時(shí)指定,也可以在配置文件里指定。Mysql服務(wù)器字符集,只是做為數(shù)據(jù)庫(kù)級(jí)的默認(rèn)值。創(chuàng)建數(shù)據(jù)庫(kù)時(shí),
6、你可以指定字符集,如果沒(méi)指定,就使用服務(wù)器的字符集。同理,創(chuàng)建表時(shí),你可以指定表級(jí)的字符集,如果沒(méi)指定,使用數(shù)據(jù)庫(kù)的字符集做為表的字符集。創(chuàng)建列時(shí),你可以指定某列的字符集,如果沒(méi)指定,就使用表的字符集。& J 2 R- M3 r通常情況下,您只需設(shè)置服務(wù)器級(jí)的字符集,其它的數(shù)據(jù)庫(kù)級(jí),表級(jí),以及列級(jí)的字符集,都繼承自服務(wù)器級(jí)字符集。! # z6 s# x! 2 q1 L由于UTF8是最廣的字符集,所以,一般情況下,我們?cè)O(shè)置Mysql服務(wù)器級(jí)的字符集為UTF8!6 5 n) t6 a6 F+ A$ K4 o* b. 普通文本的字符集問(wèn)題% K+ R( h4 0 o4 u任何文本的存儲(chǔ),都存在著字符
7、集的問(wèn)題,普通文本文件也不例外。+ 8 s6 o. _7 u- L O8 . jWindows2000+的系統(tǒng)中,打開(kāi)記事本,“保存為”對(duì)話(huà)框,就有一個(gè)選項(xiàng),可以讓你選擇存儲(chǔ)文本的編碼方式。/ _9 V% b* q9 0 s1 H7 o: m通常情況下,大家都使用Windows2000+的系統(tǒng),都使用默認(rèn)的編碼,所以,不會(huì)碰到字符集的問(wèn)題。& s Y- c 8 q i: Windows下,保存文本文件時(shí),可以選擇編碼方式,但打開(kāi)文本文件時(shí),都是自動(dòng)判斷編碼方式的。網(wǎng)上有一個(gè)用Windows2000+的記事本玩移動(dòng),聯(lián)通的笑話(huà),大家可以搜搜,就是因?yàn)閃indows在打開(kāi)文本文件時(shí),編碼判斷錯(cuò)誤引
8、起的問(wèn)題。: y L% q3 K. c d因?yàn)樽詣?dòng)判斷編碼有時(shí)會(huì)錯(cuò)誤,所以,有的文本文件,規(guī)定了如何識(shí)別自身所使用的編碼。HTML文件就是一個(gè)這樣的例子。% w& f( y: e S0 - ! # ?HTML是文本文件。存儲(chǔ)HTML文件的時(shí)候,需要使用一個(gè)編碼,并且,在HTML文件里,也使用HTML語(yǔ)法,指定了該文件所使用的編碼(比如)。如果HTML文件沒(méi)有指定編碼,則瀏覽器自動(dòng)識(shí)別文件的編碼。如果HTML指定了編碼,則瀏覽器使用HTML指定的編碼。8 ( T; M( n5 O2 V通常情況下,HTML文件指定的charset和HTML文件自身的編碼是一致的,但也有不一致的情況,如果不一致,就
9、會(huì)導(dǎo)致網(wǎng)頁(yè)亂碼(此處亂碼,只和文本文件有關(guān),和數(shù)據(jù)庫(kù)無(wú)關(guān)。)使用專(zhuān)門(mén)的網(wǎng)頁(yè)編輯工具(比如Dreamwave),會(huì)自動(dòng)根據(jù)網(wǎng)頁(yè)中的charset值來(lái)編碼文件。) g$ x# y! f: O. _. V9 qc. php+mysql的字符集問(wèn)題, n1 L! % n( S5 Q- xPHP最終生成的是文本文件,但他要取數(shù)據(jù)庫(kù)里的文本,或?qū)⑽谋敬孢M(jìn)數(shù)據(jù)庫(kù)。 o# m1 l% N+ Z |6 y, u o由于Mysql支持多字符集,默認(rèn)情況下,Mysql不知道PHP發(fā)給他的是什么編碼的字符,所以,Mysql要求客戶(hù)端(PHP)告訴他存取的字符集是什么。, m$ # G. r8 E& O/ 1 4 .
10、EPHP通過(guò)設(shè)置character_set_client,告訴Mysql,PHP存進(jìn)數(shù)據(jù)庫(kù)的是什么編碼方式。; C7 D 8 V* n& nPHP通過(guò)設(shè)置character_set_results,告訴Mysql,PHP需要取什么樣編碼的數(shù)據(jù)。6 Q, y& : u% _PHP通過(guò)設(shè)置character_set_connection,告訴Mysql,PHP查詢(xún)中的文本,使用什么編碼。9 P0 , 7 F. . MYSQL使用設(shè)置的編碼方式存儲(chǔ)文本。4 w: ? d- O6 B4 d% A/ z% m7 m, S假設(shè)Mysql使用setserver來(lái)存儲(chǔ)文本,PHP的character_set_
11、client是setclient,PHP的 character_set_results是setresult。那么,Mysql將PHP發(fā)來(lái)的文本,從setclient編碼方式,轉(zhuǎn)換成 setserver編碼方式,再存入數(shù)據(jù)庫(kù),如果PHP取文本,Mysql將文本從setserver轉(zhuǎn)換成setresult,再發(fā)送給PHP。& 5 |0 # N/ n# I8 ; b3 _3 GPHP文件(最終生成的HTML文件)本身有個(gè)編碼,如果Mysql傳過(guò)來(lái)的編碼,與PHP文件自身的編碼不同,那么,整個(gè)網(wǎng)頁(yè),必然亂碼。所以,PHP一般將自己的編碼方式,告訴Mysql。6 b/ U# r$ f# U要保證不亂碼,
12、就必須將三個(gè)編碼統(tǒng)一:一是網(wǎng)頁(yè)自身的編碼,二是HTML里指定的編碼,三是PHP告訴Mysql的編碼(包括character_set_client和character_set_results)。, D4 G; q( X7 c. d2 j第一和第二個(gè)編碼,如果使用DW之類(lèi)的編輯器寫(xiě)的網(wǎng)頁(yè),通常是一致的,但用記事本寫(xiě)的網(wǎng)頁(yè),有可能不一致。4 + G0 u9 r t V( H0 A. L第三個(gè)編碼,需要手工通知Mysql。這步可以通過(guò)在PHP里使用mysql_query(“set names characterX”)來(lái)實(shí)現(xiàn)。& ( X# r0 L$ f) Ad.字符集的轉(zhuǎn)換問(wèn)題1 W# h% l* L
13、, w6 V. v7 c如果小字集轉(zhuǎn)換成大字符集,不會(huì)丟失數(shù)據(jù),但大字集,轉(zhuǎn)換成小字集,可能會(huì)丟失數(shù)據(jù)。1 j/ v& Q D! |比如,UTF8里有的字符,GB2312不一定有,所以,從UTF8轉(zhuǎn)換到GB2312可能會(huì)丟失一些字符。6 U. h$ z! r7 - K但有種情況例外,先從GB2312轉(zhuǎn)成UTF8,再?gòu)腢TF8轉(zhuǎn)成GB2312,這種情況是不會(huì)丟數(shù)據(jù)的,因?yàn)?,剛開(kāi)始轉(zhuǎn)換的文本,都是GB2312里的字符,所以,整個(gè)過(guò)程都是GB2312的字符在轉(zhuǎn)換,不會(huì)丟失。& 0 K# Y7 w0 ) x) R7 正因?yàn)閁TF8能容納世界上的所有字符,所以,數(shù)據(jù)庫(kù)一般使用UTF8編碼。這使得,任何字
14、符都可以存進(jìn)UTF8編碼的數(shù)據(jù)庫(kù)。2 ; j, r3 ! E& n2 p3 oe. PHPMyAdmin亂碼的問(wèn)題2 t2 Y1 B, Q ; x3 PHPMyAdmin支持多國(guó)語(yǔ)言,這就必定要求HTML頁(yè)面使用UTF8編碼。4 P2 0 I - J5 r$ E6 R7 H pHTML頁(yè)面使用UTF8編碼,這就必定要求PHPMyAdmin連接Mysql時(shí),character_set_client和character_set_results使用UTF8編碼。9 7 R& O, l# S7 H當(dāng)前情況下,PHP連接Mysql只能是使用set names(或其它幾個(gè)語(yǔ)句)來(lái)通知Mysql的編碼方式,
15、如果沒(méi)有顯式的聲明編碼方式,都將使用latin1編碼。一般的程序,都沒(méi)有顯式聲明 character_set_client變量,所以,都是將gb2312文本,按latin1編碼方式存在數(shù)據(jù)庫(kù),PHPMyAdmin再用utf8格式讀取,肯定是亂碼的。: o& X) V1 H- E- / Y6 D# i) G如果PHP程序按正確的編碼存入數(shù)據(jù)庫(kù),肯定是沒(méi)有問(wèn)題的。所以,需要修改的不是PHPMyAdmin.(雖然有時(shí)修改PHPMyAdmin可以解決亂碼問(wèn)題,但這不是問(wèn)題的根本)6 V! 6 z k1 y$ c$ z$ 二總結(jié)篇, n. v+ W7 i s+ r# 上面的講得有點(diǎn)亂,總結(jié)一下:0 D$ _+ C7 n1 e: k1.數(shù)據(jù)庫(kù)盡量使用utf8存儲(chǔ)(修改/./f,在mysqld段加上default-character-set=utf8)+ o2 h9 Y# I& S3 O(已有的數(shù)據(jù)庫(kù),先轉(zhuǎn)成UTF8格式)p $ ?5 r; y Z7 f, n2.PHP程序在查詢(xún)數(shù)據(jù)庫(kù)之前,執(zhí)行mysql_query(“set names xxxx”);其中xxxx是你網(wǎng)頁(yè)的編碼(charset=xxxx),如果網(wǎng)頁(yè)中charset=utf8,則xxxx=utf8,如果網(wǎng)頁(yè)中 charset=gb2312,則xxxx=gb2312,如果網(wǎng)頁(yè)中的charset=ipaddr,則
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作聯(lián)營(yíng)協(xié)議合同范本
- 創(chuàng)建積極工作氛圍的年度計(jì)劃
- 腦梗死的護(hù)理目標(biāo)
- 完善水務(wù)責(zé)任追究機(jī)制計(jì)劃
- 塑造強(qiáng)大品牌形象的成功秘笈計(jì)劃
- 秘書(shū)職能的社會(huì)認(rèn)知提升計(jì)劃
- 廣東省廉江市實(shí)驗(yàn)學(xué)校高中政治 3.2 樹(shù)立正確的消費(fèi)觀(guān)2教學(xué)實(shí)錄(必修1)
- 2025年荊州貨運(yùn)從業(yè)資格證模擬考試題庫(kù)
- 2025年高中化學(xué)40個(gè)化學(xué)實(shí)驗(yàn)反應(yīng)的動(dòng)圖太神奇了
- 第3課+中古時(shí)期的歐洲高中歷史統(tǒng)編版(2019)必修中外歷史綱要下冊(cè)
- 閭山秘籍(精編版)
- 《地基與復(fù)合地基靜荷載試驗(yàn)》考試參考題庫(kù)(含答案)
- 人力資源服務(wù)許可證、勞務(wù)派遣經(jīng)營(yíng)許可證年檢報(bào)告書(shū)
- 患者搬運(yùn)法評(píng)分標(biāo)準(zhǔn)最終
- 《槍炮、病菌與鋼鐵》-基于地理視角的歷史解釋?zhuān)ㄣ屣L(fēng)學(xué)堂)
- 水泥粉磨工藝(行業(yè)經(jīng)驗(yàn))
- 國(guó)家自然科學(xué)基金(NSFC)申請(qǐng)書(shū)樣本
- 畢業(yè)設(shè)計(jì)(論文)-助力式下肢外骨骼機(jī)器人的結(jié)構(gòu)設(shè)計(jì)
- 觀(guān)摩臺(tái)標(biāo)準(zhǔn)化建設(shè)方案
- 銅排理論公斤重量
- 山姆會(huì)員店要求與規(guī)格(共19頁(yè))
評(píng)論
0/150
提交評(píng)論