[postgresql] “UTF8″인코딩에 대한 잘못된 바이트 시퀀스

일부 데이터를 가져 오려는 내 데이터베이스에. 그래서 임시 테이블을 만들었습니다.

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

이제 데이터 를 가져 오려고 합니다 .

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

하지만 오류가 발생합니다.

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c

어떻게 수정합니까? 전체 데이터베이스의 인코딩을 변경해야합니까 (있는 경우 어떻게?) 아니면 tmp테이블 의 인코딩 만 변경할 수 있습니까? 아니면 파일 인코딩을 변경해야합니까?



답변

데이터베이스에 UTF8 데이터를 저장해야하는 경우 UTF8을 허용하는 데이터베이스가 필요합니다. pgAdmin에서 데이터베이스 인코딩을 확인할 수 있습니다. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 “속성”을 선택하십시오.

그러나 그 오류는 소스 파일에 잘못된 UTF8 데이터가 있음을 알려주는 것 같습니다. 이는 copy유틸리티가 UTF8 파일을 공급하고 있음을 감지했거나 추측했음을 의미 합니다.

Unix의 일부 변형에서 실행중인 경우 file유틸리티를 사용 하여 인코딩 (다소 또는 적음)을 확인할 수 있습니다 .

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(저는 터미널의 Mac에서도 작동 할 것이라고 생각합니다.) Windows에서 수행하는 방법을 잘 모르겠습니다.

Windows 시스템에서 가져온 파일 (즉, UTF8로 인코딩 되지 않은 다음과 같은 내용이 표시 될 것입니다.

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

상황이 이상하다면 입력 데이터를 알려진 인코딩으로 변환하거나 클라이언트의 인코딩을 변경하거나 둘 다 시도 할 수 있습니다. (우리는 인코딩에 대한 제 지식의 한계를 확장하고 있습니다.)

사용할 수 있습니다 iconv유틸리티를 하여 입력 데이터의 인코딩을 변경할 .

iconv -f original_charset -t utf-8 originalfile > newfile

문자 집합 지원 의 지침에 따라 psql (클라이언트) 인코딩을 변경할 수 있습니다 . 해당 페이지에서 “자동 문자 집합 변환을 활성화하려면”구문을 검색합니다.


답변

psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

encoding내 경우에는 옵션을 추가 했습니다.


답변

즉석 에서 인코딩설정할 수 있습니다 .

 set client_encoding to 'latin1'

그런 다음 쿼리를 다시 실행하십시오. 그래도 어떤 인코딩을 사용 해야할지 모르겠습니다.


latin1문자를 읽을 수 있도록 만들었지 만 대부분의 악센트 부호가있는 문자는 대문자로되어 있어서는 안됩니다. 나는 이것이 잘못된 인코딩 때문이라고 생각했지만 실제로는 그저 나쁜 데이터라고 생각합니다. 결국 latin1 인코딩을 유지했지만 데이터를 사전 처리하고 대 / 소문자 문제를 해결했습니다.


답변

변환 할 수없는 문자를 버려도 괜찮다면 -c플래그 를 사용할 수 있습니다.

iconv -c -t utf8 filename.csv > filename.utf8.csv

그런 다음 테이블에 복사하십시오.


답변

이 오류는 파일의 레코드 인코딩이 연결과 관련하여 다르다는 것을 의미합니다. 이 경우 iconv는 // IGNORE 플래그에도 불구하고 오류를 반환 할 수 있습니다.

iconv -f ASCII -t utf-8 // IGNORE <b.txt> /a.txt

iconv : 위치에 잘못된 입력 시퀀스 (일부 번호)

비결은 잘못된 문자를 찾아서 바꾸는 것입니다. Linux에서 수행하려면 “vim”편집기를 사용하십시오.

vim (텍스트 파일), “ESC”: 버튼을 누르고 “: goto (iconv에서 반환 된 번호)”를 입력합니다.

ASCII가 아닌 문자를 찾으려면 다음 명령을 사용할 수 있습니다.

grep –color = ‘auto’-P “[\ x80- \ xFF]”

잘못된 문자를 제거하는 경우 파일을 변환해야하는지 확인하십시오. 문제가 이미 해결되었을 수 있습니다.


답변

pgadmin에서이 문제를 해결하려면 아래 단계를 따르십시오.

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;


답변

가져 오기 파일을 생성 한 머신 / 인코딩 유형에 따라 다릅니다.

Windows의 영어 또는 서유럽 버전에서 다운로드하는 경우 가장 좋은 방법은 ‘WIN1252’로 설정하는 것입니다. 다른 소스에서 가져온 경우 여기에서 문자 인코딩 목록을 참조하십시오.

http://www.postgresql.org/docs/8.3/static/multibyte.html

Mac에서 가져 오는 경우 먼저 “iconv”유틸리티를 통해 실행하여 MacRoman에서 UTF-8로 변환해야 할 수 있습니다.