2011-04-01 88 views
0

我正在尋找一種最佳實踐方法來將亞洲字符集支持添加到現有數據庫。我們現有的某些在latin1字符集表:「?」MySQL:將亞洲字符支持添加到現有數據庫

show create table books 
CREATE TABLE `books` (
    `id` varchar(255) NOT NULL, 
    `category` varchar(255) default NULL, 
    `contactEmail` varchar(255) default NULL, 
    `description` text, 
    `price` varchar(255) default NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

目前,當我們進入UTF8字符爲description領域,我們回來亞洲字符的來回往返。 Latin1字符工作得很好。

我可以簡單地將此錶轉換爲類似這樣的東西嗎?

ALTER TABLE books CONVERT TO CHARACTER SET utf8 

我知道這不會奇蹟般地修復表中已經存在的數據。我只是希望它能夠正常工作以獲得新的數據。

我需要擔心整理嗎?我不知道這對非拉丁字符是如何工作的。

utf8作爲數據庫的默認值是否有意義?有什麼要注意的嗎?

感謝

回答

0

我沒有與MySQL是如何處理的字符集了不少經驗,但我有一個字符集的一般經驗。

當我們爲描述字段輸入UTF8字符時,我們返回'?'亞洲字符的來回往返。 Latin1字符工作得很好。

由於您的表格使用latin1進行編碼,因此它只能存儲latin1字符集中存在的字符。 Latin1是ISO-8859-1的簡寫,你可以see what characters it has - 沒有亞洲人物,這就是他們不會存儲的原因。我有點驚訝MySQL不會在這樣的輸入錯誤。

將utf8作爲數據庫的默認值是否有意義?有什麼要注意的嗎?

如果您需要存儲多種語言的字符,UTF-8將是一個不錯的選擇。作爲Unicode編碼的UTF-8將允許您存儲來自多種語言的任何Unicode字符(實際上有數千個)。您可以使用UTF-8存儲字符串「Dogcaféθλφ你好」。 UTF-8被廣泛使用,並且能夠編碼任何東西 - 我強烈推薦它。

我會仔細閱讀互聯網,找到關於轉換MySQL表的文章,以確保沒有任何問題。如果這是生產數據,則測試脫機數據集 - 開發表或QA表。

最後,您似乎表示在您的數據庫中存在半個亞洲字符。我想知道是什麼存儲:如果它是亞洲字符的UTF-8序列,但數據庫認爲它是latin1(經典案例mojibake),則可能會有一些恢復。我擔心轉換可能會嘗試將UTF-8代碼單元轉換爲latin1,從而產生非常有趣的輸出。測試測試測試。

0

事實上,你回來'?'是一個好兆頭,因爲它表明拉丁文1中不存在的字符已被正確轉換爲替換字符。在開始轉換數據的項目之前,請確保所有內容都清晰。如果您有多個應用程序和編程語言寫入數據庫,這一點尤其重要。

一個最簡單的方法來做一個粗略和準備好的完整性檢查是檢查字節長度與字節長度。

SELECT length(foo), char_length(foo) FROM bar 

第一返回值是length of the string in bytes,第二個是length of the string in characters。如果在那裏有任何多字節字符,這兩個值會有所不同。

有很多指南可以在互聯網上轉換,而我發現one in particular是非常有用的。