2012-02-13 66 views
1

我的數據庫在latin1中,並且全部是â"'��"'(取決於我的終端分別設置爲latin1還是unicode)。從上下文來看,我認爲他們應該是emdashes。在IE中呈現(或不呈現)時,它們似乎會導致令人討厭的錯誤。我想找到並替換它們。問題是這兩個字符都不符合replace。運行查詢:替換mysql中的垃圾字符

update TABLE set COLUMN = replace(COLUMN,'��"','---'); 

執行沒有錯誤但沒有做任何事情(0行已更改)。我很清楚,當我在終端中複製它時,「鑽石中的問號」字符不匹配。有沒有辦法找出它的代碼,並通過匹配它或什麼? mysql控制檯非常接近於能夠在一行中完成此操作,所以如果我能夠避免它,我寧願不在終端外面編寫腳本。

數據庫託管在Amazon RDS中,因此我無法安裝我在其他問題中引用的regexp udf。從長遠來看,我將不得不將整個數據庫正確地轉換爲utf8,但我需要立即修復此渲染問題。

編輯:

我已經分離出的壞字符hexdump,它的E2 80(我不認爲這對應於任何Unicode字符)。我怎樣才能把它提供給替換函數?

update TABLE set COLUMN = replace(COLUMN, char(0xe2,0x80),'---'); 

什麼也沒做。

+0

它是拉丁文1的理由嗎?我傾向於現在默認使用unicode,並不難轉換 - 只需將數據庫轉儲到SQL,然後將其重新加載到使用utf8的新數據庫中。 – 2012-02-13 22:10:47

+0

我繼承了它。轉儲是不可取的,因爲它會導致我想避免的顯着的停機時間。我一直在閱讀像http://nicj.net/2011/04/17/mysql-converting-an-incorrect-latin1-column-to-utf8這樣的就地方法,但還沒有時間去適應它到我的分貝。 – mmdanziger 2012-02-13 22:32:23

+0

您可能別無選擇,只能查找包含此錯誤字符序列的所有行,並手動製作單個語句來修復每個行(但腳本可以幫助完成此操作)。 – staticsan 2012-02-13 23:25:55

回答

1

我想通了。我用mysql的內置函數hex來轉儲一個我知道不好的條目。

select hex(column) from table where id=666; 

然後挑出來的話(夾在「20」 S這些數字),發現我違規設置的字節實際上x'C3A2E282AC2671756F743B'。這與我看到它在PHP和我的系統中編碼的方式相對應(如e2 80)我不知道,在這一點上,我並不在乎。

要驗證,破壞數據之前,你插,早在到MySQL:

select x'C3A2E282AC2671756F743B'; 
    +---------------------------+ 
    | x'C3A2E282AC2671756F743B' | 
    +---------------------------+ 
    | â€"    | 
    +---------------------------+ 
    1 row in set (0.00 sec) 

因此,使用類似上面的替代查詢,我能立刻擺脫所有的壞數據。

因爲這是記錄:

update TABLE set COLUMN = replace(COLUMN, x'C3A2E282AC2671756F743B','--'); 

我真的希望這是有用的人。儘管編碼snafus在mysql中似乎很常見,但我搜索了到處都是,我無法找到這個最終相當簡單的過程的解釋。

+0

'x'C3A2''對於''是UTF-8; 'x'E282AC''是UTF-8的'€'; 'x'2671756F743B''是'"'的ASCII碼,所以有些東西在做Unicode編碼... – Neil 2012-02-14 22:07:42

+0

@Neil我認爲這個故事是文本是用一些MS cp1252(或不同的MS方案??)編寫的,然後無效轉換到UTF8並轉儲到latin1列中。 cp1252 en/em短劃線不能很好地複製到UTF8,所以無論轉換它爲什麼看起來像是任意的垃圾......但cp1252和E2 80 93(E2)中的en(em)破折號是96(97) 94)以UTF8格式...不知道這些變成了c3a2e82ac ...... – mmdanziger 2012-02-15 08:59:57

+0

E2 80 94是在Windows-1252中的「 - 」,也許這個智能報價變成了「"」。 – Neil 2012-02-15 21:52:37

0

某些東西可能已經提交了帶有UTF-8編碼(E2 80 94)的em破折號(U + 2014),您現在正在嘗試將其解釋爲latin-1,但這在拉丁文中不適用,不包括範圍80-9F,因此您可能會看到非法字節的Unicode替換字符,因此在顯示時會導致â��。通過Windows-1252中的比較,它將顯示爲â€」。您可以使用CHAR(0xE2, 0x80, 0x94)創建搜索字符串。

+0

你的回答讓我朝着正確的方向發展,我發現糟糕的角色是'e2 80'。但是,我如何形成替換查詢?這不是我期望的那樣。 – mmdanziger 2012-02-13 23:20:43

+0

其實......這不是e2 80.請參閱下面的問題解決方案。 – mmdanziger 2012-02-14 21:08:52