2013-04-19 2 views
1

ruby1.8/mysql gem에서 ruby1.9/mysql2로 마이그레이션 한 후 utf8로보고되는 레거시 db에서 문자열을 가져 오지만 latin1로 인코딩 된 것처럼 보일 수 있습니다 직선적 인 force_encoding이 도움이되지 않는 것처럼, 어떤 종류의 이중 인코딩을 가짐).MySQL에서 잘못된 인코딩을 사용하여 문자열을 변환하는 중

문자열 예 : 나는 루비 코드) 누군가가 전환 A를 도와 줄 수

фывапролджэ - just a test string - йцукенгшщзхъ 

로 변환 할 수 있도록하려면, 및/또는 b) SQL과

Ñ„Ñ‹Ð²Ð°Ð¿Ñ€Ð¾Ð»Ð´Ð¶Ñ - just a test string - йцукенгшщзхъ 

?

복사 붙여 넣기로 인해 반환 된 문자열의 일부 정보, 바이트가 누락 될 수 있습니다. [195, 145, 226, 128, 158, 195, 145, 226, 128, 185, 195, 144, 194, 178, 195 144, 194, 176, 195, 144, 194, 191, 195, 145, 226, 130, 172, 195, 144, 194, 190, 195, 144, 194, 187, 195, 144, 194, 180, 195 , 144, 194, 182, 195, 145, 194, 141, 32, 45, 32, 106, 117, 115, 116,32,97,32,116,101,115,116,32,115,116,114 , 105, 110, 103, 32, 45, 32, 195, 144, 194, 185, 195, 145, 226, 128,160,195,145,198,146,195,144,194,186,195,144 194, 181, 195, 144, 194, 189, 195, 144, 194, 179, 195, 145, 203, 134, 195, 145, 226, 128, 176, 195, 144, 194, 183, 195, 145 , 226, 128, 166, 195, 145, 197, 160]

+1

나는 이것을 과거에 가지고있었습니다. 루비 1.8에서 UTF8 바이트를 보내고 라틴어 1로 잘못 저장하는 것이 쉽습니다. 처음에는 blob로 변환 한 다음 utf8 문자열/텍스트 열로 다시 돌려서 MySQL 측 문제를 해결해야합니다. 이것은 MySQL이 데이터를 다시 해석하도록합니다. –

+0

올바른 방향으로 힌트를 보내 주셔서 감사합니다. 아래의 내 대답을 참조하십시오. (내용에 맞지 않습니다.) – UncleGene

답변

1

오케이, 이것에 대한 SQL 솔루션은 How to fix double-encoded UTF8 characters (in an utf-8 table)입니다.

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

Ruby를 사용 하시겠습니까?

+0

데이터베이스 내용이 맹 글링되면 해당 항목을 언 매니지해야합니다. Ruby에서 아무런 소란이 없다. – tadman

+0

루비 변환의 이점은 느리게 처리 될 수 있다는 것입니다 (분명히 멱등수입니다). 타이밍에 따라 데이터베이스 변환이 까다 롭습니다. 기존 클라이언트가 새로운 레코드를 찾고 있거나 새로운 클라이언트가 이전 클라이언트를 찾고있는 배치 전략을 사용합니다. – UncleGene

+0

idempotency 코멘트를 무시하십시오. 잘못된 해결책과 관련 있습니다. – UncleGene

0

데이터베이스 연결 코드 config/database.yml에서 원하는 결과를 얻을 때까지 다른 설정으로 실험하십시오.

어떤 이유로 연결이 기본값 인 latin1 일 수 있지만 내부적으로 UTF8로 다시 해석됩니다.

+0

가능한 모든 연결 인코딩 설정을 시도했는데 모두에 대해 가비지가 있습니다. 또한 코드를 utf8로 사용하고 싶습니다. - 모든 새 레코드가 정확하게 기록/검색됩니다. 문제는 레거시 레코드에만 있습니다. – UncleGene