2009-10-08 75 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

相关问题