2009-10-08 73 views
0

看來,我們已經成功地插入到我們的數據庫2 Unicode字符,每個我們想要的Unicode字符的,固定的Unicode哎呀

例如,對於unicde焦炭0x3CBC,我們已經插入Unicode的等價物它的每個組件(0xC383和0xC2BC)

任何人都可以想出一個簡單的解決方案來解決這個問題嗎?

我拿出像

SELECT replace(name, CONCAT(0xC3,0x83,0xc2,0xbc), CONCAT(0xc3,0xbc)) FROM lang

針對上述情況,但不希望有每一個Unicode字符做到這一點!

+0

首先,你確定這是真正的問題嗎?在顯示字符時也可能存在問題(當它們在基礎中正確編碼時)。 如果底座中存在真正的問題,那麼我沒有看到任何其他解決方案遍歷基底的每個字符串行的每個字節;但是這可以通過算法很容易地完成。 – 2009-10-08 13:11:22

+0

是的,我敢肯定,我已經完成了十六進制轉儲等數據:( – Mez 2009-10-08 13:14:18

+0

你有沒有想過這是怎麼發生的?我想如果你現在是如何發生的,那麼我們可以找出如何扭轉這個過程。 – longneck 2009-10-08 14:27:32

回答

3

爲unicde炭0x3CBC

我假設你指帶分音符的Unicode的字符U + 00FC拉丁小寫字母U(ü),其以UTF-8編碼爲\ XC3 \ XBC 。

我不認爲你可以在MySQL內進行更改。你可以這樣做:

-- convert doubly-encoded UTF-8 to singly-encoded 
ALTER TABLE table MODIFY column TEXT CHARACTER SET latin1; 
-- deliberately lose encoding information 
ALTER TABLE table MODIFY column BLOB; 
-- interpret the single-encoded UTF-8 bytes as UTF-8 
ALTER TABLE table MODIFY column TEXT CHARACTER SET utf8; 

對於架構中的每一列。這適用於您給出的具體示例,但在UTF-8蹤跡字節之一處於0x80-0x9F範圍內時失敗。這是因爲MySQL的'latin'編碼實際上不是ISO-8859-1,而是實際上Windows cp1252,它以不同的方式映射範圍內的字符。

也許最簡單的方法是傾銷這批貨,並在mysqldump文件上進行轉換。例如。來自Python:

# Remove one level of UTF-8 encoding 
# 
dump= open('/path/to/dump.sql', 'rb').read() 
dump= dump.decode('utf-8').encode('iso-8859-1') 
open('/path/to/dump-out.sql', 'wb').write(dump) 
+0

對於python解決方案,.encode('iso-8859-1')是一個很好的技巧,可以將原始字節從unicode對象中取出。 – 2009-10-08 17:39:56

相關問題