代码之家  ›  专栏  ›  技术社区  ›  Mez

修复Unicode OOP

  •  0
  • Mez  · 技术社区  · 15 年前

    似乎我们已经成功地在数据库中为我们想要的每个Unicode字符插入了2个Unicode字符,

    例如,对于unicode char 0x3bc,我们为每个组件(0xc383和0xc2bc)插入了Unicode等价物。

    有人能想出一个简单的解决办法吗?

    我想出了一些办法

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

    对于上面的内容,但不希望对每个Unicode字符都这样做!

    1 回复  |  直到 14 年前
        1
  •  3
  •   bobince    14 年前

    对于unicode char 0x3bc

    我猜你是指带分音符的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的拉丁编码实际上不是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)