2012-05-04 92 views
1

我很困惑我的數據庫的字符編碼。MySQL UTF-8編碼

我用UTF8_general_ci配置數據庫。但是,如果我試圖用西班牙文保存某些東西,比如「león」,那麼內容si會被破壞然後修復它,所以我必須在保存之前使用utf8_decode,並且當我讀取時使用utf8_encode。

然後西班牙語是正確的。

現在我有俄羅斯用戶在cyrilic寫作,他的內容是被寵壞(與???????)

我想,如果我不使用utf8_decode的cyrilic將是正確的(或不我不不知道)但西班牙語將是不正確的。

如何正確保存所有語言?我很困惑。

+1

客戶端/連接使用什麼字符集? –

回答

1

嘗試作爲第一statment運行該SQL查詢:

set names 'utf8'; 

這設置了MySQL引黃聯接的爲UTF-8編碼並防止雙重編碼。

+0

謝謝!我已經在連接之後推出了:mysql_query(「SET NAMES'utf8'」);它看起來很完美! – Oscardr

1

檢查您的客戶端執行

SET NAMES 'utf8'; 

當啓動一個會話。檢查表中所有表和所有char字段使用utf-8編碼(它們的編碼可能與數據庫編碼不同)。

1

我使用腳本將數據庫中的所有錶轉換爲utf8字符集。試試看:

<? 
$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpass = ''; 
$dbname = 'db_name'; 
$collation = "utf8_general_ci"; 
$charset = "utf8"; 

mysql_connect($dbhost,$dbuser,$dbpass); 
mysql_select_db($dbname); 

mysql_query("ALTER DATABASE $dbname COLLATE $collation"); 
$result = mysql_query("SHOW TABLES"); 
while ($row = mysql_fetch_row($result)) { 
mysql_query("ALTER TABLE $row[0] COLLATE $collation"); 
$result1 = mysql_query("SHOW COLUMNS FROM $row[0]"); 
while ($row1 = mysql_fetch_assoc($result1)) { 
if (preg_match('~char|text|enum|set~', $row1["Type"])) { 
mysql_query("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] CHARACTER SET $charset"); 
mysql_query("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] COLLATE $collation DEFAULT '$row1[Default]'"); 
echo $row[0] . "->" . $row1[Field] . "->" . $row1[Type] . " is now UTF8 
"; 
} 
} 
} 
mysql_free_result($result); 

?> 
+0

Thannk你但它應該是我的數據庫在UTF-8,我定義的字段在UTF-8我不明白爲什麼我必須將數據庫更改爲UTF-8。 – Oscardr

+0

我需要一個快速的解決方案,並在連接後添加 mysql_query(「SET NAMES'utf8'」); 而且看起來效果不錯,現在我更放鬆了。 現在我會仔細閱讀您的鏈接,並嘗試瞭解tpasku腳本。 謝謝你,你真棒! 奧斯卡。 – Oscardr

0
http://stackoverflow.com/questions/367711/what-is-the-best-collation-to-use-for-mysql-with-php 

MySQL字符集-----------------

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html 

你可以指定一個更具體的UTF- 8個字符集,如'utf8_swedish_ci'

+0

我需要一個快速解決方案,並在連接後添加 mysql_query(「SET NAMES'utf8'」); 而且看起來效果不錯,現在我更放鬆了。 現在我會仔細閱讀您的鏈接,並嘗試瞭解tpasku腳本。 謝謝你,你真棒! 奧斯卡。 – Oscardr