2014-10-16 2 views
1

상황 : latin1 데이터베이스가 iconv를 통해 utf8으로 변환되고 utf8_unicode_ci로 복원됩니다.MySQL latin1을 utf8로 변환하십시오. 0x80-0x9F wrong

cp1252에서 0x80-0x9F를 제외한 모든 변환이 잘된 것처럼 보입니다. mysql :

라틴는 기본 문자 집합은 내가 완전히 MySQL이 유니 코드에 그 문자를 변환하여 무엇을 의미하는지 이해하지 못했다. MySQL의 latin1은 Windows cp1252 문자 세트와 동일합니다. 이는 IANA latin1이 0x80과 0x9f 사이의 코드 포인트를 "정의되지 않음"으로 취급한다는 점을 제외하면 공식 ISO 8859-1 또는 IANA (Internet Assigned Numbers Authority) latin1과 동일 함을 의미합니다. 반면 cp1252 및 MySQL의 latin1은 문자를 할당합니다 그 위치를 위해. 예를 들어, 0x80은 유로 기호입니다. cp1252의 "undefined"항목의 경우, MySQL은 0x81을 유니 코드 0x0081, 0x8d를 0x008d, 0x8f를 0x008f, 0x90을 0x0090, 0x9d를 0x009d로 변환합니다.

테이블이 예를 들어 € 0x80 대신 0xC280으로 표시됩니다. 그래서 난 내 테스트 보여로 내가 오해 대신 내가

iconv -f cp1252 -t utf-8 

에 의해 변환해야

iconv -f latin1 -t utf8 

를 통해 변환 된 것 같아요. 두 번째 줄이 바로 일하고 있기 때문입니다.

그래서 잘못된 문자를 수정하는 것이 가능한지 또는 전체 데이터베이스를 덤프해야합니까?

편집 : 는 나쁜 데이터베이스를 덤프 및 데이터베이스에 다시

--default-character-set=utf8 
    iconv -c -f utf-8 -t latin1 
    iconv -f latin1 -t utf-8 

를 통해 다음 삽입 변환 할 수 있습니까? iconv -c가 나를 도와 주거나 정보를 잃어 버릴 수 있습니까?

EDIT2 : 하나를 사용하여 하나 깨진 문자를 대체 할 수 있음을 보인다

update history set note = replace(note,unhex('C280'),unhex('E282AC')); 

이 성공적으로 정확한 3 바이트의 UTF8과 잘못된 2 바이트의 glibberish을 대체합니다. 물론이 작업은 varchar/text 열과 0x80-0x9F 범위의 깨진 문자 각각에 대해 수행해야합니다. 이는 처리되지 않습니다. 누군가가 더 좋은 아이디어를 가지고 있기를 바랍니다.

답변

0

지금까지 내가의 iconv 명령이 C의의 iconv 기능을 기반으로 이해 : http://www.gnu.org/software/libiconv/documentation/libiconv-1.11/iconv.3.html

의 iconv 기능이 호출 동안 비 가역적 인 방법으로 변환 된 문자 수를 반환; 가역적 전환은 으로 계산되지 않습니다. 에러가 발생하면 errno를 설정하고 (size_t) (- 1)을 반환합니다.

역 변환을 시도 할 수 있지만 문서에 따르면 결과는 첫 번째 변환의 반환 코드에 따라 다릅니다. 물론 바이너리로 잘못된 문자를 대체 할 수도 있습니다.

+0

나쁜 점은 반환 코드를 인쇄하지 못했기 때문에 숫자가 잘못되었다는 것입니다. ( 어떻게 이진 접근 방식이 좋을까요? – gantners

+1

도움이 될 수 있습니다. http://stackoverflow.com/questions/7760717/hex-string-replacement-using-sed – Matzz

관련 문제