php mysql apache編碼深度解析

2021-06-09 20:25:08 字數 2599 閱讀 8465

php+mysql+apache編碼深度解析

好了,廢話少說,直接切入:

我們在做php專案的時候,經常會遇到中文亂碼的問題,有時候編碼問題還導致mysql的報錯。中文亂碼總共有三個原因

1:apache伺服器設定導致亂碼

2:php,或者html頁面編碼導致中文亂碼

3:mysql資料庫的表以及字段編碼導致中文亂碼

我們分別從這三個部分來**php程式設計中的編碼問題

在這之前我們要了解一些基本理論:

1、檔案編碼

每個檔案在儲存的時候都可以選擇以什麼編碼儲存,例如用windows的記事本建立乙個檔案可以選擇ansi 以及utf8等等編碼。我們選擇了什麼編碼該檔案就以這種編碼方式儲存在硬碟上。 讀取該檔案資料的時候也會指定一種編碼來開啟,如果指定的編碼與檔案儲存的時候的編碼不一樣的話就會出現亂碼

2、html的編碼

在網頁頭部一般有這樣乙個區域

這個的意思是讓客戶端知道,接下來輸出的是html**(text/html),並且以下輸出的內容都將是utf-8編碼的。如果我們用記事本建立乙個html檔案 該檔案包含

但是在儲存的時候卻以ansi編碼格式儲存,那麼我們用瀏覽器開啟這個檔案時,瀏覽器看見meta 行的utf8編碼設定後 就將檔案以utf8格式輸出,而檔案本來是ansi編碼,這樣便出現了中文亂碼。

一:apache伺服器編碼

在apache配置檔案中有一行是編碼的設定 預設的是adddefaultcharset iso-8859-1,大部分人認為應該將這句改為 adddefaultcharset utf-8 。而蝸牛認為這是誤人子弟。 這項配置是告訴apache伺服器選用什麼樣的編碼來輸出web頁面(這樣做會忽略,html頁面中的頁面編碼的設定 eg:),如果我們建立乙個gb2312的頁面就會出現中文亂碼 。所以最好的方法是將adddefaultcharset iso-8859-1這一項注釋掉 #adddefaultcharset

二:php編碼問題

php最終生成的是文字檔案,而他要從資料庫中取出文字資料,還要把文字資料寫到資料庫中。由於mysql並不知道php傳送給他的是什麼編碼的資料,所以需要客戶端php告訴他訪問的是什麼編碼的資料。然後mysql會自動將php傳送來的資料轉換成目標編碼格式的資料。

比如: php要將 文字資料date 寫入到資料庫欄位field中,php傳送的是utf-8編碼的資料,而date是以gb2312方式儲存的。這時候php通過設定告訴mysql 我發的是utf-8格式,mysql接到資料後 說:」我知道了,來誰專門負責將utf-8轉換成gb2312「 於是mysql中的乙個專門負責此事的小兵跑來 把資料拿走經過加工放到指定位置,如果php誤將utf-8編碼的資料 當作gb2312編碼 送給mysql的時候,mysql會叫上次那個負責utf-8—-gb2312的小兵來負責,而小兵不管三七二十一按同樣方法轉換存起來,這就出現了錯誤,亂碼就產生了。取資料的時候也一樣,php要告訴mysql要取出什麼樣編碼的資料。

php通過character_set_client告訴mysql,php存入資料庫的是什麼編碼方式

php通過character_set_results告訴mysql,php需要取什麼樣編碼的資料

php通過character_set_connection告訴mysql,php查詢中的文字,使用什麼編碼

就算上面的大家都注意了,還有個問題也可能導致亂碼。那就是php檔案(生成的html頁面)本身的編碼問題

如果mysql傳來的資料 編碼與php本身編碼不一致也會導致亂碼

三:mysql編碼問題

mysql目前支援多字符集,並且,支援在不同的字符集之間轉換(便於移植和支援多語言)。

mysql可以設定伺服器級字符集、資料庫級字符集、資料表級字符集、表列的字符集,實際上,最終使用字符集的地方是儲存字元的列,比如,你設定 table1中col1列是字元型別,col1才用到了字符集,如果table1表的col2列是int型別,col2不使用字符集的概念。

伺服器級字符集、資料庫級字符集、資料表級字符集都是為列的字符集做預設選項的。

mysql一定有乙個字符集,可以通過啟動時加引數指定 ,也可以編譯時指定,也可以在配置檔案裡指定。mysql伺服器字符集,只是做為資料庫級的預設值。建立資料庫時,你可以指定字符集,如果沒指定,就使用伺服器的字符集。同理,建立表時,你可以指定表級的字符集,如果沒指定,使用資料庫的字符集做為表的字符集。建立列時,你可以指定某列的字符集,如果沒指定,就使用表的字符集。

通常情況下,您只需設定伺服器級的字符集,其它的資料庫級,表級,以及列級的字符集,都繼承自伺服器級字符集。

由於utf8是最廣的字符集,所以,一般情況下,我們設定mysql伺服器級的字符集為utf8!

總結:

要保證不亂碼,需將三個編碼統一:

一:是網頁自身的編碼

二:是html裡指定的編碼

三:是php告訴mysql的編碼(包括character_set_client和character_set_results)。

第一和第二個編碼,如果使用dw之類的編輯器寫的網頁,通常是一致的,但用記事本寫的網頁,有可能不一致。

第三個編碼,需要手工通知mysql。這步可以通過在php裡使用mysql_query(「set names characterx」)來實現。

php mysql apache 環境安裝

第一步 安裝mysql root localhost usr groupadd mysql root localhost usr useradd g mysql mysql root localhost usr cd usr local root localhost local tar zxvf m...

php mysql apache 配置筆記

今天特意配置了mysql apache php 雖然網上很多這方面的例子,但是很多是作者再回憶寫的,所以難免有筆誤的地方。而這些東西,正是新手很困惑的地方。一下是我的安裝筆記,在centos虛擬機上安裝成功。中文的參考 英文的參考 how to install mysql 5.0 on linux,...

php mysql apache 環境搭建

安裝apache2.2 這裡選擇 自定義 安裝,使用者也可以預設安裝 單機 build headers and libraries 選擇 this feature will be installed on local dirive.使用者可以修改安裝路徑 這裡使用預設的路徑 安裝完成後 右下角出現a...