2016-01-28 42 views
1

我們有兩個不同的編碼數據(utf8和latin1)組成的表,它們是從兩個不同的應用程序使用情況插入的。 如果我們以一種編碼獲取數據,我們正在爲其他語言文本獲取斷開的字符串問題。我們需要將總表數據轉換爲單一編碼。將表(包含兩種編碼數據)的所有數據轉換爲單一編碼utf8或latin1

如: 表X
ID名稱數據編碼
1ébarber - UTF8
2間GOGO - LATIN1

如果我們使用 「latin1的」 連接字符集,我們得到的問題與 「ébarber」(破字符串)。 如果我們使用「utf8」連接字符集,我們得到「àgogo」(斷開的字符串)的問題。

我們該如何將這個表格數據轉換爲單一的編碼utf8或latin1?
請分享您的想法來解決這個問題。

回答

0

這是可能的。但這是痛苦的。

  1. 轉換爲BINARY
  2. 識別哪些行含有編碼。這可以是自動的,但可能不是100%正確的。
  3. 針對這些行執行特殊的UPDATE
  4. 轉換爲utf8

詳細說明:

步驟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:此從latin1編碼柱(col)轉換爲UTF-8:

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 ...; 

買者!儘管我已經告訴你的各個部分都已知可以工作,但拼湊而成的組合已經測試過而不是。我強烈懷疑會有某種形式的打嗝。