将表的所有数据(具有两种编码数据)转换为utf8或latin1的单一编码

时间:2016-01-28 09:41:46

标签: mysql encoding utf-8 character-encoding

我们有两个不同的编码数据(utf8和latin1)组成的表,它是从两个不同的应用程序用例中插入的。 如果我们在一个编码中获取数据,我们就会遇到其他语言文本的字符串问题。我们需要将总表数据转换为单个编码。

例如: 表X
id名称数据编码
1ébarber - utf8
2àgogo - latin1

如果我们使用“latin1”连接字符集,我们会遇到“ébarber”(断字符串)的问题。 如果我们使用“utf8”连接字符集,我们会遇到“àgogo”(断弦)的问题。

如何将此表数据转换为utf8或latin1的单一编码?
 请分享您的想法以解决此问题。

1 个答案:

答案 0 :(得分:0)

有可能。但这很痛苦。

  1. 转换为BINARY
  2. 确定哪些行包含哪种编码。这可以自动化,但可能不是100%正确。
  3. 对这些行执行特殊UPDATE
  4. 转换为utf8
  5. 详细说明:

    第1步:转换为二进制:

    ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; -- with suitable matching other stuff, or
    ALTER TABLE Tbl MODIFY COLUMN col BLOB ...;  -- if it were TEXT.
    

    第2步:找到latin1行(否定以下内容):

    SELECT HEX(col) ...提取十六进制以用于下面的正则表达式

    此正则表达式检查utf8(实际上是utf8mb4):

    /^(
         [\xC2-\xDF] [\x80-\xBF]
    
       |  \xE0[\xA0-\xBF][\x80-\xBF]
       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
       |  \xED[\x80-\x9F][\x80-\xBF]
    
       |  \xF0[\x90-\xBF][\x80-\xBF]{2}
       | [\xF1-\xF3][\x80-\xBF]{3}
       |  \xF4[\x80-\x8F][\x80-\xBF]{2}
    )+/ox
    

    组合这些应该告诉你一行可能是 utf8。

    第3步:这会将列(col)从latin1编码转换为utf8:

    CONVERT(CONVERT(col USING latin1) USING utf8)
    

    第4步:让它成为utf8:

    ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...; -- or
    ALTER TABLE Tbl MODIFY COLUMN col TEXT ... CHARACTER SET utf8 ...;
    

    警告!虽然我所知道的各个部分都可以使用,但是拼凑在一起的组合已经进行了测试。我强烈怀疑会有某种形式的打嗝。