source

이중 인코딩 UTF8 문자 수정 방법(utf-8 테이블)

goodcode 2023. 1. 9. 21:40
반응형

이중 인코딩 UTF8 문자 수정 방법(utf-8 테이블)

전회LOAD DATA INFILECSV 파일이 다음과 같은 전제 하에 실행되었습니다.latin1- - - 。이 Import에서는 멀티바이트 문자는 2개의 단일 문자로 해석되어 utf-8(다시)을 사용하여 부호화되었습니다.

이 이중 인코딩으로 인해 다음과 같은 이상 징후가 생성되었습니다.ñ대신ñ.

이 끈들은 어떻게 고쳐야 하죠?

다음 MySQL 함수는 이중 인코딩 후 올바른 utf8 문자열을 반환합니다.

CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8)

사용 가능한 것은, 다음과 같이 사용할 수 있습니다.UPDATE다음 명령어를 사용하여 필드를 수정합니다.

UPDATE tablename SET
    field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8);

위의 답변은 일부 데이터에 적용되었지만 실행 후 많은 NULL 열이 생성되었습니다.변환에 실패하면 무효가 반환된다고 생각합니다.그것을 피하기 위해 나는 소액 수표를 추가했다.

UPDATE
    tbl

SET
    col =
    CASE
        WHEN CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8) IS NULL THEN col
        ELSE CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8)
    END

mysql은 인식되지 않는 문자 뒤에 있는 모든 데이터를 삭제하기 때문에 "utf8" 대신 "utf8mb4"를 사용하는 것이 매우 중요합니다.그래서 더 안전한 방법은,

UPDATE tablename SET
field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8mb4);

조심해요.

저도 이 문제에 직면해 있습니다.여기서 Oracle을 위한 솔루션을 소개합니다.

update tablename t set t.colname = convert(t.colname, 'WE8ISO8859P1', 'UTF8') where t.colname like '%Ã%'

Java용 또 다른 기능:

public static String fixDoubleEncoded(String text) {
    final Pattern pattern = Pattern.compile("^.*Ã[^0-9a-zA-Z\\ \t].*$");
    try {
        while (pattern.matcher(text).matches())
            text = new String(text.getBytes("iso-8859-1"), "utf-8");
    }
    catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return text;
}

언급URL : https://stackoverflow.com/questions/11436594/how-to-fix-double-encoded-utf8-characters-in-an-utf-8-table

반응형