2012-02-22 64 views
0

我使用PHP腳本從外部將數據導入到我的數據庫MYSQL中。從查詢編碼數據庫和服務器

ALTER DATABASE DEFAULT CHARSET 'utf8'; 

然後編碼我的數據庫字符集爲utf8我執行的查詢通過

SHOW VARIABLES LIKE 'character_set%'; 

輸出到看到所有的字符集是:

+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

我們可以看到character_set_database設置到utf8,但仍然如果我從我的PHP腳本編寫的代碼看到編碼爲

echo $charset = mysql_client_encoding($cn); 

輸出是latin1。從上面的查詢latin1僅適用於服務器。任何人都可以告訴我到底我錯過了什麼,因爲我無法將我的中文和日文字符編碼到數據庫中。

編輯

我從導入之外的數據庫具有Unicode字符作爲我的上網主頁和嶏紞鎴戠殑在中國,日本人等不同的語言。 但是,當我導入數據到我的數據庫表我得到?????而不是上面的字符。我如何編碼這些字符?它是UTF-8或16,我怎麼能識別哪個編碼將支持這些字符?

+0

你應該更好地解釋你真正的問題,因爲'mysql_client_encoding'只返回已設置的連接時刻的字符集。 – zerkms 2012-02-22 04:41:27

+1

mysql_set_charset()在您連接之後;另外,爲數據庫設置默認值將不會更改現有表。 – miki 2012-02-22 04:42:44

+0

@zerkms請看到我的編輯 – Astha 2012-02-22 04:50:45

回答

3

character_set_database只是指在該DB中創建的任何表的默認字符集,我認爲是。因此,具有將其設置爲UTF-8也無濟於事,我建議如下:

我每次初始化我的數據庫連接,我執行$db->query("SET NAMES 'utf8'");

約SET NAMES會談 https://stackoverflow.com/a/1650834/1221902

更多集名字批評

這將取決於你的MySQL/PHP版本,相應的功能,這將是對"SET NAMES 'utf8'"查詢一個更好的選擇的可用性。

一組名稱 'x' 的語句等價於這三個語句:

SET character_set_client字符= X; SET character_set_results = x; SET character_set_connection = x;

http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html MySQL的5.1(人很多仍然使用5.1)

character_set_results系統變量指示的字符集 在服務器返回查詢結果到客戶端。這包括 結果數據(如列值)和結果元數據(如 列名稱)。

+0

這不會設置客戶端的編碼。 – 2012-02-22 04:43:33

+0

這是不建議,因爲PHP 5.2.3 – zerkms 2012-02-22 04:45:02

+0

@ Col.Shrapnel它將http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html使用 – 2012-02-22 04:52:42

-1

您正在查看:客戶端編碼。
雖然上述變量僅僅是服務器端的,你必須使用

mysql_set_charset() 

正如你說,你正在使用過時的PHP版本,你唯一的選項來設置客戶端編碼(升級PHP /開關驅動器旁)是SET NAMES <actual data encoding>集名查詢。

因爲它沒有證明,你的問題在設置連接編碼但也有一些神祕的「進口」。由於你沒有提供任何細節,我只能猜測。
如果要導入一些MySQL的轉儲 - 檢查表定義。那裏的charset很可能是錯誤的。你可以簡單地用搜索&替換它。

+0

只要它是'character_set_client |在服務器上的utf8' - 懷疑它會改變anytihng – zerkms 2012-02-22 04:44:07

+0

我使用PHP 5.1,它不支持此功能。 – Astha 2012-02-22 04:48:06

+0

@Astha:您需要升級至少最新的5.2.x.最新的5.1版本已於2006年8月發佈,大約在5.5年前。 – zerkms 2012-02-22 04:51:00

相關問題