2012-12-19 58 views
4

我的一些文本顯示奇怪,我需要替換它上面的一些字符。但是我有一個特定的字符,下面的一個麻煩(javascript代碼,以顯示字符的區別):在MySQL中替換奇怪的字符

<script> 
alert('–'.charCodeAt(0) + ':' + '-'.charCodeAt(0)); 
</script> 

在MySQL中我嘗試應用下面的查詢:

UPDATE translation SET columnx = REPLACE(columnx, '–', '-'); 

但它影響0行。所以問題是,什麼是正確的查詢來取代這些奇怪的字符到正確的?

UPDATE

怪異炭顯示這樣的(方形):

Weird char, displayed as square

在JSON,它被編碼爲\u0096代替-

+0

...或者你可以解決根本問題,並讓你的字符顯示「正常」。 –

+0

有一種機制可以接受這些文本(全部在ISO-8859-1中),使用UTF-8對它們進行編碼,從它們生成JSON並將它們顯示在JSON的另一側,它們顯示爲正方形。我無法控制這一點,並被要求更正數據庫。我已經在其他字符上取代了,例如''''替換爲'''但是沒有這個特定的運氣。 – RedDragon

+0

祝你好運。你基本上被卡住了7位ASCII碼。 –

回答

2

這看起來不是字符集,但整理有關。排序規則定義了MySQL在分類或比較時如何將字符視爲「幾乎相等」。

例如,ISO-8859-15默認排序規則將治療ü = u

你可以做的是把你的領域就像一個箱子整理。 二進制排序規則不會將相似字符視爲相等。

選擇正確的二進制排序

SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLLATIONS WHERE COLLATION_NAME LIKE '%bin%'; 

然後執行你這樣的更新:

UPDATE TABLE SET columnx = REPLACE(columnx COLLATE latin1_bin, '–', '-'); 

更正: 更換比較使用二進制排序

編輯總是做:

如果仍然有0行更新,您可能不會替換正確的字符。 轉換包含字符爲十六進制,並張貼十六進制值,所以我們可以找出哪些燒焦我們正在談論

例如串

SELECT HEX(columnx) LIMIT 1; 

EDIT2:

剛剛看到,你居然說你\u0096這是一個控制字符稱爲START OF GUARDED AREA ..什麼都設定此角色創造了..在六角這是0xC2 0x96。 在您的示例查詢中,您將替換名爲EN DASH的字符集

只需粘貼它即可替換控制字符,轉換可能會將其分解。相反,你可以使用UNHEX(hexval)來告訴MySQL的字符你的意思是

UPDATE TABLE SET columnx = REPLACE(columnx UNHEX('C296'), '-'); 

,或者使這更清楚(或更加混亂:)),這可以通過「正常」的連字符的十六進制值以及

UPDATE TABLE SET columnx = REPLACE(columnx UNHEX('C296'), UNHEX('2D')); 
3

像阿爾瓦羅說,你應該真的嘗試將數據庫更改爲正確的字符集。通常utf-8字符集應該足夠了。

更多信息請看這裏: http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

如果你沒有權利這樣做,也許看看: http://dev.mysql.com/doc/refman/5.1/de/charset-convert.htmlhttps://dba.stackexchange.com/questions/9944/mysql-transfer-iso-8859-1-to-utf-8

+0

這將涉及到更改他們訪問數據庫的所有系統,我認爲這在我們的情況下不是可行的。 – RedDragon

+0

如果我沒有問題,甚至不能解決問題 –