2010-05-13 61 views
2

我將我的php應用程序移至新服務器。我使用mysql5分貝。當我更新或插入某些數據庫時,每個"-標誌更改爲?。我使用SET NAMES UTF8SET CHARACTER SET,但它不起作用。有任何想法嗎?mysql和編碼

回答

0

我的猜測是,你從它轉化成"有角度的漂亮報價有些文本編輯器粘貼,並且將您的-成MDASH,這是造成兩者被表示爲?

雖然您將數據庫設置爲接受UTF8字符,但您可能未設置Web服務器/ PHP以接受這些字符。嘗試玩mbstring函數,但請檢查以確保您未使用傾斜的引號或破折號。

+0

還有其他方法去做這個?我無法安裝任何額外的軟件包到我的PHP發行版,似乎沒有安裝mbstring – qqryq 2010-05-13 01:13:01

+0

我不確定。你可以嘗試運行一個HTML編碼來轉換引號......但這可能不是最好的解決方法。 – 2010-05-13 01:14:59

2

SET NAMES UTF8應該在每個頁面上使用,當選擇以及更新或插入時。

實際上,每次連接到數據庫時都必須使用此查詢。只需添加它即可連接代碼。

+0

它是everywere,我有我的db_connect.php文件,我包括無處不在。 – qqryq 2010-05-13 11:31:30

1

您需要UTF-8全部貫通,使智能引號和破折號的方式(「」 - )其他非ASCII字符和可靠地工作:

(1)確保瀏覽器會將您編碼成UTF字符-8。通過聲明,包括形式爲UTF-8的頁面操作:

<head> 
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 
    ... 

(忽略<form accept-encoding>,這並不在IE右鍵工作)

(2)與原始字節PHP交易和不關心他們在編碼什麼,但數據庫確實在意,所以你必須告訴它什麼編碼來自PHP的字節進來。這就是SET NAMES正在做什麼,但mysql_set_charset可能更可取。

(3)一旦正確的字符到達數據庫,它將需要將它們存儲在Unicode編碼中以確保所有字符都適合。每列可以有不同的編碼,但當您使用UTF-8編碼時,您可以使用DEFAULT CHARACTER SET utf8來使CREATE table中的所有文本列都可用。如果您願意,也可以將數據庫或整個服務器的默認字符集設置爲utf8

如果您已經有CREATE d表並且它們是非UTF-8歸類,則必須重新創建表或alter表。您可以使用SHOW FULL COLUMNS FROM sometable;來檢查當前的排序規則。 (4)請確保您使用htmlspecialchars()而不是htmlentities()來自PHP輸出的HTML編碼文本,默認情況下會混淆非ASCII字符。 [作爲(2)和(3)的替代方法,只需使用連接和表存儲的默認Latin-1編碼,但仍然可以將UTF-8字節放入其中。這種方法的缺點是,看着數據庫的其他工具看起來不對,而小寫/大寫字符不會以預期的不區分大小寫的方式相互比較。]

+0

我已經把這個UTF8字符集標題放到了我的頁面頂部,但它沒有幫助,當我提交像「」這樣的字符形式 - 並在phpMyAdmin中檢查它們時,它們變成了'?'。我不知道爲什麼。 – qqryq 2010-05-14 17:00:13

+0

我懷疑你的表沒有存儲UTF-8。請檢查點(3)。 – bobince 2010-05-14 17:22:45