這是可能的。但這是痛苦的。
- 轉換爲
BINARY
- 識別哪些行含有編碼。這可以是自動的,但可能不是100%正確的。
- 針對這些行執行特殊的
UPDATE
。
- 轉換爲
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 ...;
買者!儘管我已經告訴你的各個部分都已知可以工作,但拼湊而成的組合已經測試過而不是。我強烈懷疑會有某種形式的打嗝。