난 일부 데이터를 가져 오려는 내 데이터베이스에. 그래서 임시 테이블을 만들었습니다.
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에서이 문제를 해결하려면 아래 단계를 따르십시오.
-
SET client_encoding = 'ISO_8859_5';
-
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로 변환해야 할 수 있습니다.