상황 : 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 범위의 깨진 문자 각각에 대해 수행해야합니다. 이는 처리되지 않습니다. 누군가가 더 좋은 아이디어를 가지고 있기를 바랍니다.
나쁜 점은 반환 코드를 인쇄하지 못했기 때문에 숫자가 잘못되었다는 것입니다. ( 어떻게 이진 접근 방식이 좋을까요? – gantners
도움이 될 수 있습니다. http://stackoverflow.com/questions/7760717/hex-string-replacement-using-sed – Matzz