大家都知道從 mysql4.1 版本開始,支援多種編碼,包括我們熟知的 latin1、gbk、utf8、big5 等等,還有一些我們聞所未聞的。
在使用 php 連線 mysql 查詢出來的資料有的時候居然會是亂碼,關於亂碼的解決首先我們要了解 mysql 的編碼機制。
拿 discuz! 論壇為例,discuz! 論壇在連線 mysql 後會立即執行乙個設定(見include/db_mysql.class.php ):
@mysql_query("set character_set_connection=$dbcharset, character_set_results=$dbcharset, character_set_client=binary", $this->link);此三處的字元設定很大程度上會解決亂碼問題,那麼這三個設定具體有什麼作用呢?如果我們了解了 mysql 的編碼機制,就可以避免在安裝外掛程式及平時的操作過程中產生亂碼,還可以自行對論壇的資料進行轉碼。
character_set_client 我們可以理解為 sql 語句的編碼,如果設定為 binary,mysql 就當二進位制來處理,character_set_connection 設定的值則告訴 mysql 用來執行 sql 語句的時候使用的編碼,也就是說,程式傳送給 mysql 的 sql 語句,會首先被 mysql 從 character_set_client 指定的編碼轉換到 character_set_connection 指定的編碼,如果 character_set_clien 指定的是 binary ,則 mysql 就會把 sql 語句按照 character_set_connection 指定的編碼解釋執行。
當執行 sql 語句的過程中,比如向資料庫中插入取出資料的時候,欄位也有編碼設定,如果欄位的編碼設定和 character_set_connection 指定的不同,則 mysql 會把插入的資料轉換成字段設定的編碼。
當 sql 執行完畢向客戶端返回資料的時候,會把資料從欄位指定的編碼轉換為 character_set_results 指定的編碼,如果 character_set_results=null 則不做任何轉換動作,(注意這裡設定為 null 不等於沒有設定,沒有設定的時候 mysql 會繼承全域性設定)。
了解了 mysql 的編碼機制,我們就可以利用這個機制進行資料的轉碼以及避免在程式使用過程中出現亂碼了。
補充:
mysql_query("character_set_client=gbk"); 這句告訴 mysql 我接下來要用的 sql 語句的編碼是 gbk 的
mysql_query("character_set_connection=gbk"); 這句 告訴 mysql 要把 sql 語句轉換成 gbk 進行處理
mysql_query("character_set_results=gbk"); 這句告訴 mysql 查詢返回的結果要統一都轉換成 gbk 編碼的
MySQL 編碼機制
character set client 這是使用者告訴mysql查詢是用的什麼字符集。character set connection mysql接受到使用者查詢後,o le按照character set client將其轉化為character set cono lenection設定的字符集。...
mysql 程式編碼 MySql編碼
一般在mysql使用中文查詢 都是用 set names character character set client 這是使用者告訴mysql查詢是用的什麼字符集。character set connection mysql接受到使用者查詢後,按照character set client將其轉化為...
mysql事務機制 Mysql事務機制
mysql事務是指將資料庫從一種一致性狀態轉到另一種一致性狀態 mysql事務具有acid特性 原子性 atomicity 事務中的所有操作,要麼全部執行,要麼都不執行 一致性 consistency 事務開始和結束後,資料庫的完整性不會被破壞 隔離性 isolation 事務之間互不影響。事務的隔...