2010-12-09 5 views
2

레이크 작업 내에서 한 데이터베이스에서 다른 데이터베이스로 데이터를 이동하려고합니다.Rails로 인코딩 된 데이터 이동

그러나, 나는 데이터의 일부에 약간의 과일 인코딩 문제납니다 :

rake aborted! 
PGError: ERROR: invalid byte sequence for encoding "UTF8": 0x92 
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". 

나는이 오류를 해결하고있는 데이터를 얻기 위해 무엇을 할 수 있는가? 내가 알 수있는 한 (인코딩에 대해 알지 못함) 원본 DB는 latin1입니다.

+0

0x92는 재미있는 짐승입니다; http://en.wikipedia.org/wiki/C0_and_C1_control_character는 0x92가 "내부 용으로"예약되어 있음을 나타냅니다. http://en.wikipedia.org/wiki/ISO/IEC_8859-1 또는 내 시스템의 iso-8859-1 맨 페이지에는 0x92에 대한 다른 해석이 없습니다. 0x92가 데이터베이스에 어떻게 들어 갔습니까? – sarnold

+0

두 데이터베이스가 동일한 인코딩을 사용합니까? "psql -l"은 인코딩을 나열합니다 (http://www.postgresql.org/docs/8.1/static/multibyte.html 참조). config.encoding은 config/application.rb에서 "utf-8"로 설정되어 있습니까? – seb

답변

0

두 데이터베이스는 다음 내보내고 인코딩을 변경하기 위해 pg_dump의 옵션을 사용하여 전체 데이터베이스를 가져올 수 있습니다 PG를하면 ... 그것은 아마도 가장 성능이 좋은 방법은 그것을 할 것

당신은 레이크을 통해이 작업을 수행하는 경우 이 보인다 구가 라틴 반면 작업은 새 데이터베이스가 UTF8입니다

... 그것은 실제로 당신이 그것을 모든 속성을 터치하여 재 인코딩해야합니다 의미합니다 ... 당신의 레이크-작업 내부의 트랜스 코딩 작업을 수행 할 수 있습니다

당신은 그것을 사용하여 모든 문자열/텍스트/텍스트와 같은 값을 인코딩 할 수 있습니다 ... respond_to에 대한 검사 (: encodin g) 일부 인코딩 정보가 첨부 된 경우에만 데이터가 인코딩되는지 확인합니다. 이자형. 숫자 값은 늘 아니라 내가 가지고 ... 그냥, 기존의 DB에서 레코드를 읽을이 방법을 통해 그것을 실행 한 다음 새 데이터베이스

u = OldDBUser.first 
u.attribute_names.each { |x| 
    u[x.to_sym] = transcode u[x.to_sym] 
} 
#... whatever you do with the transcoded u 

에 기록 할 수 있습니다 지금

def transcode(data, toEnc = 'utf8') 
    if data.respond_to?(:encoding) && data.encoding.name != toEnc 
    return data.dup.force_encoding toEnc 
    end 
    data 
end  

트랜스 코딩 할 수 테스트를 거치지는 않았지만, 아마도 당신이 필요로하는 모든 것

관련 문제