修复Unicode哎呀

时间:2009-10-08 13:04:02

标签: mysql unicode utf-8

似乎我们设法在我们的数据库中为我们想要的每个unicode字符插入2个unicode字符,

例如,对于unicde char 0x3CBC,我们为它的每个组件插入了unicode等价物(0xC383和0xC2BC)

有人能想出一个解决这个问题的简单解决方案吗?

我想出了像

这样的东西

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

对于上述内容,但不希望每个unicode角色都这样做!

1 个答案:

答案 0 :(得分:3)

  

表示unicde char 0x3CBC

我假设你的意思是Unicode char U + 00FC LATIN SMALL LETTER U WITH DIAERESIS(ü),它以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的'拉丁'编码不是真正的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)