2012-06-04 76 views
2

好的,所以我確保我的MySQL(5.1.61)數據庫是UTF8,表格是UTF8,字段是UTF8,MySQL客戶端的字符集設置爲UTF8。我可以成功地存儲和檢索UTF8條目。我還確保我的終端的編碼設置爲UTF8。包含UTF8字符的舊條目在UTF8數據庫中保存不正確

CREATE TABLE `cities` (
    `name` varchar(255) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

問題涉及到數據庫中已存在的200,000個條目。看起來我們繼承了這個項目的人搞砸了很多編碼,實際上保存了一個字符串,如HörbyHörby,其中Ã是有效的UTF8字符。也就是說,MySQL正在接收一個UTF8字符串Hörby,並將其存儲爲。這裏就是第一個條目是舊條目的一個例子,第二個是我們將「Hörby」與一切將數據庫設置爲UTF-8:

mysql> INSERT INTO cities SET name = 'Hörby'; 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM cities; 
+----------+ 
| name  | 
+----------+ 
| Hörby | <--- old entry 
| Hörby | <--- new entry 
+----------+ 

我們能做些什麼給壓扁字符轉換爲他們曾經是什麼?我們現在已經準備好做任何事情,但重新輸入所有200,000條記錄是不可行的。

+0

你有什麼辦法確定哪些記錄是「舊」記錄(在數據庫更改之前),哪些記錄是「新」? – eggyal

+0

@eggyal:是的,大約99%的數據庫包含舊記錄。我們可以在此時手動重新添加新條目。 – JustinBull

回答

5

它看起來像您以前存儲utf8編碼字符串在latin1列,然後轉換該列utf8。爲了解決這個問題:

  1. 轉換的數據回latin1

    ALTER TABLE cities MODIFY name varchar(255) CHARACTER SET latin1; 
    
  2. 改變列型爲UTF-8,而不改變數據(通過binary去):

    ALTER TABLE cities MODIFY name varchar(255) CHARACTER SET binary; 
    ALTER TABLE cities MODIFY name varchar(255) CHARACTER SET utf8; 
    
0

您可以在MYSQL中使用REPLACE函數。

喜歡的東西 -

`UPDATE cities 
SET name = REPLACE(name, 'ö', 'ö');` 
+0

不幸的是,這會涉及到找到所有不好的角色,弄清楚他們應該是什麼,然後爲每個不好的角色寫一個REPLACE。 – JustinBull

+0

沒有其他選擇。你如何告訴MySQL這是好的,保持它,這是不好的,取而代之呢? – JHS

相關問題