php mysql apache字符集(二) (轉)

1 MYSQL中的字符集概念
  Mysql的字符集裏有兩個概念,一個是"Character set(字符集)",另外一個是"Collations"。
1.1 Collations
  Collations翻成中文是"校驗",在網頁開發的過程當中,這個詞彙,只在Mysql裏使用,主要做用是指導Mysql對字符的比較,好比, ASCII字符集裏,Collations規定了a小於b,a等於a,以及a是否等於A之類的。一般,你們基本能夠忽略Collations的存在,由於每一個字符集都有一個默認的Collations,一般,使用默認的Collations就能夠了。
1.2 Character set
  與這對比的是,字符集是個更廣的概念,即便是Windows下普通的文本文件,也滲及到字符集的問題。不一樣的字符集,規定了不一樣的字符的編碼方式。一個 character set (字符集)是一組符號和編碼,好比,ASCII字符集,包括的字符有:數字,大小寫字母,分號、換行之類的符號,編碼方式是用一個7bit表示一個字符(A的編碼是65,b的編碼是98)。ASCII只規定了英文字母的編碼,非英文語言不能用ASCII編碼表示,爲此,不一樣的國家,都爲本身的語言作了編碼,好比,咱們國家,就有GB2312編碼。但每一個國家之間的編碼不一樣,也存在着一些跨平臺的問題,爲此,一些國際化標準組織,就制定了一些國際通用的編碼,最經常使用的就是UTF8了。ASCII只對英文符號和英文字母作了編碼,GB2312對英文符號,英文字母,漢字作了編碼,UTF8對世界上全部的語言文字作了編碼,因此,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。因而可知,UTF8是所含最廣字符的字符集,因此,在一些多語言的WEB系統中,通常用UTF8字符集(PHPMyAdmin使用UTF8編碼)。
任何文本的存儲,都滲及到字符集的概念。包括數據庫,也包括普通的文本文件。
  編碼和字符集兩個概念極易混淆,由於通常狀況下,編碼的名字和字符集的名字相同,如:GB2312既是一種字符集的名字,也是一種編碼格式的名字。
字符:漢字,英文字母,標點符號,拉丁文等等。
編碼:將字符轉換成計算機存儲的格式,好比,A用65表示。
字符集:一組字符以及對應的編碼方式。

  可見字符集和編碼是兩個不一樣的概念。一個字符集能夠有多種編碼方式,如Unicode字符集就有UTF-八、UTF-1六、UTF-32等編碼方式。 php

 charset=utf-8,在網頁中的意思是該頁面時採用Unicode字符集,並採用UTF-8編碼方式。
1.3 Mysql的字符集
  Mysql目前支持多字符集,而且,支持在不一樣的字符集之間轉換(便於移植和支持多語言)。
Mysql能夠設置服務器級字符集、數據庫級字符集、數據表級字符集、表列的字符集,實際上,最終使用字符集的地方是存儲字符的列,好比,你設置 table1中col1列是字符類型,col1纔用到了字符集,若是table1表的col2列是int類型,col2不使用字符集的概念。
服務器級字符集、數據庫級字符集、數據表級字符集都是爲列的字符集作默認選項的。
Mysql 必定有一個字符集,能夠經過啓動時加參數指定,也能夠編譯時指定,也能夠在配置文件裏指定。Mysql服務器字符集,只是作爲數據庫級的默認值。建立數據庫時,你能夠指定字符集,若是沒指定,就使用服務器的字符集。同理,建立表時,你能夠指定表級的字符集,若是沒指定,使用數據庫的字符集作爲表的字符集。建立列時,你能夠指定某列的字符集,若是沒指定,就使用表的字符集。
一般狀況下,您只需設置服務器級的字符集,其它的數據庫級,表級,以及列級的字符集,都繼承自服務器級字符集。
因爲UTF8是最廣的字符集,因此,通常狀況下,咱們設置Mysql服務器級的字符集爲UTF8。
  MYSQL中字符集的繼承關係
        服務器字符集(在配置文件中設置字符集的方式:my.ini [mysqld] default-character-set=utf8)
            |
            |
            |
        數據庫級字符集(若是建立數據庫是指定了字符集,則使用指定的字符集。若是沒有,則使用服務器級的字符集)
            |
            |
            |
        表級字符集(建立表時指定了字符集,則使用指定的字符集。若是沒有,則使用數據庫級的字符集)
            |
            |
            |
        列級字符集(建立表時指定了列的字符集,則使用指定的字符集。若是沒有,則使用表級的字符集)
  可見最終使用字符集的地方是存儲文本的列。
2 普通文本的字符集問題
  任何文本的存儲,都存在着字符集的問題,普通文本文件也不例外。
Windows2000+的系統中,打開記事本,"保存爲..."對話框,就有一個選項,可讓你選擇存儲文本的編碼方式。
一般狀況下,你們都使用Windows2000+的系統,都使用默認的編碼,因此,不會碰到字符集的問題。
Windows下,保存文本文件時,能夠選擇編碼方式,但打開文本文件時,都是自動判斷編碼方式的。網上有一個用Windows2000+的記事本玩移動,聯通的笑話,你們能夠搜搜,就是由於Windows在打開文本文件時,編碼判斷錯誤引發的問題。
由於自動判斷編碼有時會錯誤,因此,有的文本文件,規定了如何識別自身所使用的編碼。HTML文件就是一個這樣的例子。
HTML是文本文件。存儲HTML文件的時候,須要使用一個編碼,而且,在HTML文件裏,也使用HTML語法,指定了該文件所使用的編碼(好比)。若是HTML文件沒有指定編碼,則瀏覽器自動識別文件的編碼。若是HTML指定了編碼,則瀏覽器使用HTML指定的編碼。
一般狀況下,HTML文件指定的charset和HTML文件自身的編碼是一致的,但也有不一致的狀況,若是不一致,就會致使網頁亂碼(此處亂碼,只和文本文件有關,和數據庫無關。)使用專門的網頁編輯工具(好比Dreamwave),會自動根據網頁中的charset值來編碼文件。
   例如:test.html
       內容以下:
          <h1>123地方活動家恢復搭街坊456</h1>
   無論上述文件保存時使用什麼編碼方式,用瀏覽器打開都會正常,不會出現亂碼。這是由於瀏覽器能自動識別編碼格式。
       將上述文件內容該爲:
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          <h1>123地方活動家恢復搭街坊456</h1>
      這時test.html不使用UTF-8編碼格式保存,瀏覽器打開必定會出現亂碼。由於瀏覽器將使用UTF-8編碼來解析收到的數據。

3 php+mysql的字符集問題
  PHP最終生成的是文本文件,但他要取數據庫裏的文本,或將文本存進數據庫。
因爲Mysql支持多字符集,默認狀況下,Mysql不知道PHP發給他的是什麼編碼的字符,因此,Mysql要求客戶端(PHP)告訴他存取的字符集是什麼。
PHP經過設置character_set_client,告訴Mysql,PHP存進數據庫的是什麼編碼方式。
PHP經過設置character_set_results,告訴Mysql,PHP須要取什麼樣編碼的數據。
PHP經過設置character_set_connection,告訴Mysql,PHP查詢中的文本,使用什麼編碼。
MYSQL使用設置的編碼方式存儲文本。
假設Mysql使用setserver來存儲文本,PHP的character_set_client是setclient,PHP的 character_set_results是setresult。那麼,Mysql將PHP發來的文本,從setclient編碼方式,轉換成 setserver編碼方式,再存入數據庫,若是PHP取文本,Mysql將文本從setserver轉換成setresult,再發送給PHP。
PHP文件(最終生成的HTML文件)自己有個編碼,若是Mysql傳過來的編碼,與PHP文件自身的編碼不一樣,那麼,整個網頁,必然亂碼。因此,PHP通常將本身的編碼方式,告訴Mysql。
要保證不亂碼,就必須將三個編碼統一:一是網頁自身的編碼,二是HTML裏指定的編碼,三是PHP告訴Mysql的編碼(包括character_set_client和character_set_results)。
第一和第二個編碼,若是使用DW之類的編輯器寫的網頁,一般是一致的,但用記事本寫的網頁,有可能不一致。
第三個編碼,須要手工通知Mysql。這步能夠經過在PHP裏使用mysql_query("set names characterX")來實現。html

http://blog.csdn.net/martinkro/article/details/5352474mysql

相關文章
相關標籤/搜索