似乎我们设法在我们的数据库中为我们想要的每个unicode字符插入2个unicode字符,
例如,对于unicde char 0x3CBC,我们为它的每个组件插入了unicode等价物(0xC383和0xC2BC)
有人能想出一个解决这个问题的简单解决方案吗?
我想出了像
这样的东西 SELECT replace(name, CONCAT(0xC3,0x83,0xc2,0xbc), CONCAT(0xc3,0xbc)) FROM lang
对于上述内容,但不希望每个unicode角色都这样做!
答案 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)