"UTF8"인코딩에 대한 잘못된 바이트 시퀀스


125

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

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테이블 의 인코딩 만 변경할 수 있습니까? 아니면 파일 인코딩을 변경해야합니까?


가져올 때 인코딩 옵션을 변경하십시오. "Windows-1251"로 설정했는데 불만없이 작동했습니다.
Brian D

1
@BrianD에게 감사드립니다. 저도이 문제에 직면했고 이것이 저에게 효과적이었습니다.
gouravkr

답변:


110

데이터베이스에 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 (클라이언트) 인코딩을 변경할 수 있습니다 . 해당 페이지에서 "자동 문자 집합 변환을 활성화하려면"구문을 검색합니다.


3
파일이 ASCII이지만 악센트 부호가있는 문자가 포함되어 있으므로 잘못된 것입니까?
mpen

2
이 답변을 수락하지만 실제로 문제는 데이터 (업데이트 된 Q)에 있다고 생각합니다.
mpen

1
도움이되었습니다. 감사합니다. 그런데, 그것은뿐만 아니라 OS X 터미널에서 실행
라울 르네에게

1
이것은 나를 위해 일했지만 약간 다른 방식으로 작동했습니다. "iconv"명령은 실제로 내 파일을 폭격했지만 문제가있는 곳에서 바로 작동했습니다. 이상한 종류의 "-"문자입니다. 어쨌든, 나는 그것을 제거했고 내 파일은 postgres에로드 할 수있었습니다. 팁 고마워!
trip0d199

1
다른 사람과 검색 엔진을 돕기 위해 : 읽을 수없는 문자가있는 Stripe CSV 내보내기를 다시 UTF-8로 변환하는 데 사용됩니다.`iconv -f ISO-8859-15 -t utf-8 customers.csv> customers-utf8.csv`
sscarduzio

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

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


1
오류없이 완료되며 유용한 결과를 제공하거나 제공하지 않을 수 있습니다. 데이터의 의도 된 인코딩을 알아야합니다.
Jasen 2015 년

1
내 시나리오에서 위의 쿼리는 어떻게 작동합니까? UTF8로 인코딩 된 CSV 파일과 UTF8로 인코딩 된 DB가 있습니다.
아제 Takur

14

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

 set client_encoding to 'latin1'

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


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


흥미롭게도 SELECT 문에 오류가 발생했습니다! 이것은 데이터베이스 자체가 아니라 오류를 제공하는 내 psql 클라이언트 이기 때문에 해결 되었습니다. (처음에 데이터를 거부했을 때 인코딩이 금지되어있었습니다.)
Wildcard

14

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

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

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


맥에 그것은이었다 iconv -c -t UTF-8 filename.csv > filename.utf8.csv나를 위해
마이클

8

이 오류는 파일의 레코드 인코딩이 연결과 관련하여 다르다는 것을 의미합니다. 이 경우 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]"

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


iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
Jasen 2015 년

5

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

  1. SET client_encoding = 'ISO_8859_5';

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


4

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

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

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

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


4

글쎄, 나는 같은 문제에 직면했다. 그리고 내 문제를 해결 한 것은 다음과 같습니다.

Excel에서 다른 이름으로 저장을 클릭하십시오. 파일 형식에서 .csv를 선택합니다 . 도구를 클릭합니다 . 그런 다음 드롭 다운 목록에서 웹 옵션 을 선택 합니다. 에서 인코딩 탭으로 문서 저장 유니 코드 (UTF-8) . 확인을 클릭하십시오. 파일을 저장하십시오. 완료!


3

나는 같은 문제가 있었고 여기에서 좋은 해결책을 찾았습니다 : http://blog.e-shell.org/134

이는 데이터베이스 인코딩의 불일치로 인해 발생합니다. 확실히 SQL 덤프를 얻은 데이터베이스는 SQL_ASCII로 인코딩되고 새 데이터베이스는 UTF8로 인코딩 되었기 때문입니다. .. Recode는 주어진 파일의 인코딩을 즉석에서 변경할 수 있도록하는 GNU 프로젝트의 작은 도구입니다.

그래서 재생하기 전에 덤프 파일을 다시 코딩했습니다.

postgres> gunzip -c /var/backups/pgall_b1.zip | recode iso-8859-1..u8 | psql test

Debian 또는 Ubuntu 시스템에서는 패키지를 통해 레코딩 할 수 있습니다.


2

예를 들어, 백 슬래시 문자를 sed로 파이프 문자로 바꿀 수 있습니다.

sed -i -- 's/\\/|/g' filename.txt

2
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

UTF8 인코딩을 처리하기 위해 이것을 시도 할 수 있습니다.


2

PHP에서이 문제를 해결하는 간단한 예제-

$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);

오류 세부 정보 : POSTGRES 데이터베이스는 위의 입력을 열에 전달하려고 할 때 UTF-8 문자 이외의 다른 문자를 처리하지 않으므로 ""UTF8 "인코딩에 대한 잘못된 바이트 시퀀스 : 0xab"오류가 발생합니다.

따라서 POSTGRES 데이터베이스에 삽입하기 전에 해당 값을 UTF-8로 변환하십시오.


2

동일한 문제가 발생했습니다. 내 파일이 UTF-8로 인코딩되지 않았습니다. 메모장 ++로 파일을 열고 파일 인코딩을 변경하여 문제를 해결했습니다.

"인코딩"으로 이동하여 "UTF-8로 변환"을 선택하십시오. 변경 사항을 저장하기 만하면됩니다!


1

이 오류는 입력 데이터에 이스케이프 문자가 포함 된 경우 발생할 수 있습니다. 기본적으로 이스케이프 문자는 "\"기호이므로 입력 텍스트에 "\"문자가 포함되어 있으면 ESCAPE 옵션을 사용하여 기본값을 변경해보십시오.


1

파이썬의 경우 다음을 사용해야합니다.

Class pg8000.types.Bytea (str) Bytea는 PostgreSQL 바이트 배열에 매핑 된 str 파생 클래스입니다.

또는

Pg8000.Binary (값) 이진 데이터를 보유하는 객체를 구성합니다.


1

나는 Windows에서 psql (그래픽 도구 없음)로 독점적으로 작업하는 동안이 문제가 발생했습니다. 이 문제를 해결하려면 PostgreSQL 서버의 기본 인코딩과 일치하도록 psql (클라이언트)의 기본 인코딩을 영구적으로 변경하십시오. CMD 또는 Powershell에서 다음 명령을 실행합니다.

setx PGCLIENTENCODING UTF8

변경 사항을 적용하려면 명령 프롬프트 / Powershell을 닫았다가 다시 엽니 다.

백업 파일의 인코딩을 메모장으로 열고 파일-> 다른 이름으로 저장으로 이동하여 유니 코드에서 UTF8로 변경합니다. 인코딩 드롭 다운을 유니 코드에서 UTF8로 변경합니다. (또한 백업 파일 이름에 .txt 확장자를 추가하지 않도록 파일 형식을 텍스트 문서 (.txt)에서 모든 파일로 변경하십시오). 이제 백업을 복원 할 수 있습니다.


0

이 오류로 인해 필드가 제자리에서 암호화 될 수도 있습니다. 올바른 테이블을보고 있는지 확인하십시오. 경우에 따라 관리자가 대신 사용할 수있는 암호화되지 않은보기를 생성합니다. 최근에 매우 유사한 문제가 발생했습니다.


0

Excel에서 생성 한 csv를 Postgres 테이블 (모두 Mac에서)에 복사하려고 할 때 동일한 오류가 발생했습니다. 이것이 내가 해결 한 방법입니다.

1) Atom (내가 사용하는 IDE)에서 파일 열기

2) 파일을 사소하게 변경하십시오. 파일을 저장하십시오. 변경을 취소합니다. 다시 저장하십시오.

프레스토 악장! 이제 복사 명령이 작동했습니다.

(나는 Atom이 작동하는 형식으로 저장했다고 생각합니다)


0

메모장으로 CSV 파일 열기 ++. 메뉴 Encoding\ Encoding in UTF-8를 선택한 다음 몇 개의 셀을 수동으로 수정하십시오.

그런 다음 다시 가져 오십시오.


0

CSV를 SQL Server에서 내보낼 예정이고 크기가 크고 유니 코드 문자가있는 경우 인코딩을 UTF-8다음 과 같이 설정하여 내보낼 수 있습니다 .

Right-Click DB > Tasks > Export > 'SQL Server Native Client 11.0' >> 'Flat File Destination > File name: ... > Code page: UTF-8 >> ...

다음 페이지에서는 테이블에서 데이터를 복사 할 것인지 쿼리를 작성할 것인지 묻습니다. 당신이있는 경우 char또는 varchar데이터 유형 테이블에서 쿼리 옵션을 선택하고 그 열을 캐스팅 nvarchar(max). 예를 들어 myTable첫 번째 열과 두 번째 열이있는 두 개의 열이있는 경우 첫 번째 열을 다음 varcharint같이 캐스팅합니다 nvarchar.

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.