2016-04-10 143 views
4

我繼承了我需要進一步開發的Web系統。 該系統似乎是由閱讀2章PHP教程的人創建的,並認爲他可以編碼...如何將mysql latin1轉換爲utf8

因此...網頁本身是UTF8,並顯示並輸入所有內容。數據庫表已使用UTF8字符集創建。但是,在配置中,有「SET NAMES LATIN1」。換句話說,UTF8編碼的字符串通過強制latin1編碼填充到數據庫中。

有沒有辦法將這個混亂轉換爲實際存儲在utf8中並擺脫latin1? 我試過這個:http://alexking.org/blog/2008/03/06/mysql-latin1-utf8-conversion但由於數據庫表設置爲utf8,這是行不通的。也試過這一個https://www.percona.com/blog/2007/12/18/fixing-column-encoding-mess-in-mysql/沒有成功。

我也許能夠通過讀取latin1編碼的PHP中的所有表格,然後將它們寫回到utf8中的新數據庫,但如果可能的話我想避免它。

回答

12

我設法通過運行文本字段這樣更新來解決這個問題:

UPDATE table SET title = CONVERT(CONVERT(CONVERT(title USING latin1) USING binary) USING UTF8) 
2

除非您已經在數據庫中已經有很多非羅馬字符(即,不能用拉丁-1表示的字符),否則情況並非如您所想的那樣糟糕。 Latin-1是utf8的一個子集。您的網絡應用程序使用utf8,您的表格內容也使用utf8。所以不需要轉換表格。

因此,請嘗試將SET NAMES latin1更改爲SET NAMES utf8。它可能會解決你的問題,允許你的php程序的連接使用與連接兩端的代碼相同的字符集。

閱讀此項。 http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html

+0

該數據庫包含許多匈牙利字符串,其中包含無法用latin1表示的重音符號。該頁面與SET NAMES latin1一起使用,如果將其更改爲SET NAMES utf8,則會產生混亂。 我需要導入一個包含匈牙利每個城市名稱的新表格。它是在適當的UTF8,所以如果我作爲拉丁1訪問數據庫它會搞砸了。因此,我要麼將當前的數據庫轉換爲正確的UTF8,要麼將城市列表轉換爲強制的latin1。我更喜歡前者。 – Moha

0

更改列的數據類型

VARBINARY ,它會自動轉換成LATIN1 DATAS

感謝你們。 我希望這有幫助。