database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7070 게시물 읽기
No. 7070
PostgresSQL 7.3 -> 8.2.3 업그레이드 시 encoding error
작성자
무적초보
작성일
2007-03-05 16:01
조회수
7,385

안녕하세요.


PostgresSQL 7.3 -> 8.2.3 업그레이드 하려고 테스트 중인데...


pg_dumpall 로 받아서 psql로 데이터를 넣으면 아래와 같은 여러 에러가 뜨면서


해당 테이블의 자료가 입력되지 않습니다.


psql:test.dump:666: ERROR:  invalid byte sequence for encoding "EUC_KR": 0xe761

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".

CONTEXT:  COPY board, line 580



문자셋은 기존에 EUC-KR인걸 그대로 덤프받아 EUC-KR에 그대로 넣는데...


별도로 더 설정해줘야하는 부분이 있는 것인가요?


이곳에서 여러 게시물을 보며 이리저리 해봤는데..


능력이 부족한 탓에 해결하지를 못했습니다. ㅜㅡ


도움 부탁드립니다.



apache 2.0.59, centos 4.4



- 기존 PostgresSQL 버전 및 설정


intradb=# select * from version();

                          version

-----------------------------------------------------------

 PostgreSQL 7.3 on i686-pc-linux-gnu, compiled by GCC 2.96




-- postgresql.conf의 initdb 설정 부분


# These settings are initialized by initdb -- they might be changed

lc_messages = 'ko_KR.eucKR'                     # locale for system error message

                                                                # strings

lc_monetary = 'ko_KR.eucKR'                     # locale for monetary formatting

lc_numeric = 'ko_KR.eucKR'                      # locale for number formatting

lc_time = 'ko_KR.eucKR'                         # locale for time formatting




-- locale 값


LANG=ko_KR.eucKR

LC_CTYPE="ko_KR.eucKR"

LC_NUMERIC="ko_KR.eucKR"

LC_TIME="ko_KR.eucKR"

LC_COLLATE="ko_KR.eucKR"

LC_MONETARY="ko_KR.eucKR"

LC_MESSAGES="ko_KR.eucKR"

LC_PAPER="ko_KR.eucKR"

LC_NAME="ko_KR.eucKR"

LC_ADDRESS="ko_KR.eucKR"

LC_TELEPHONE="ko_KR.eucKR"

LC_MEASUREMENT="ko_KR.eucKR"

LC_IDENTIFICATION="ko_KR.eucKR"

LC_ALL=







개발(업글)PostgresSQL 버전

intradb=# select * from version();

                                              version

---------------------------------------------------------------------------------------------------

 PostgreSQL 8.2.3 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3)




-- postgresql.conf의 initdb 설정 부분


LC_MESSAGES = 'ko_KR.eucKR'

LC_MONETARY = 'ko_KR.eucKR'

LC_NUMERIC = 'ko_KR.eucKR'

LC_TIME = 'ko_KR.eucKR'




-- locale 값

LANG=ko_KR.eucKR

LC_CTYPE="ko_KR.eucKR"

LC_NUMERIC="ko_KR.eucKR"

LC_TIME="ko_KR.eucKR"

LC_COLLATE="ko_KR.eucKR"

LC_MONETARY="ko_KR.eucKR"

LC_MESSAGES="ko_KR.eucKR"

LC_PAPER="ko_KR.eucKR"

LC_NAME="ko_KR.eucKR"

LC_ADDRESS="ko_KR.eucKR"

LC_TELEPHONE="ko_KR.eucKR"

LC_MEASUREMENT="ko_KR.eucKR"

LC_IDENTIFICATION="ko_KR.eucKR"

LC_ALL=



intradb=# show server_encoding;

 server_encoding

-----------------

 EUC_KR

(1 row)




intradb=# show client_encoding;

 client_encoding

-----------------

 EUC_KR

(1 row)











이 글에 대한 댓글이 총 1건 있습니다.

한글 문제 정리

PostgreSQL에서는 버전 7.2부터 해당 인코딩에 벗어난 멀티바이트 글자의 조합을 
입력자체가 안되도록 정책을 정했습니다. 

그 결과, euc-kr 인코딩을 사용하는 데이터베이스에서는 확장 완성형 글자나, 깨진 한글 같은 것을 사용할 수 없게 되었습니다. 

결국, 한글 인코딩을 사용할 수 없게 되었습니다.
그 대안으로 utf-8 인코딩을 사용합니다. 
현재로써는 그 방법 밖에 다른 방법이 없습니다. 
 

1. 이미 데이터베이스 클러스터가 만들어진 상태라면,
 - 이미 initdb 명령으로 관리할 데이터베이스들이 있는 상태를 말합니다 - 
 먼저 쉘에서 pg_controldata 명령으로 만들어진 데이터베이스 클러스터에서 사용하는 lc-collate 값이 무엇인지 살펴봐야합니다. 

$ pg_controldata /home/postgres/data

이런식으로 사용됩니다. 이 명령어 인자는 initdb 때 -D 옵션에 지정한  데이터베이스 디렉토리입니다.
이 명령은 initdb 명령을 실행했던 시스템 사용자 권한으로 실행되어야합니다.

이 명령의 결과 맨 끝에, 

LC_COLLATE:                           C
LC_CTYPE:                             ko_KR.UTF-8

또는

LC_COLLATE:                           C
LC_CTYPE:                             C

형태로 나와야합니다.

이렇게 나오지 않는다면, initdb 작업을 다시 해야합니다.


2. initdb 작업은 간단하게, 

$ initdb --no-locale -D /home/postgres/data -E utf-8
또는
$ initdb --locale=ko_KR.UTF-8 --lc-collate=C -D /home/postgres/data -E utf-8

형태로 윗 값이 나오도록 데이터베이스 클러스트를 만듭니다. 



3. 옛자료를 utf-8 문자셋으로 바꾸어서 사용하기

기존에 SQL_ASCII 또는 EUC_KR 문자셋으로 저장된 자료를 utf-8 데이터베이스에 자료를 넣으려면, 
먼저 덤프받은 자료가 UTF8 문자셋으로 100% 변환되는지부터 테스트 해보셔야합니다. 

왜냐하면, 7.2 이하 버전에서는 '한글이 아니더라도 한글로 처리하는 것을 당연하다'고 처리했기 때문입니다. 

그렇지 않고 그냥 작업을 하게 되면, 

invalid byte sequence for encoding 오류를 냅니다.

가장 쉽게 처리 하는 방법은 

$ iconv -c -f cp949 -t utf8 dumpdata.sql > dumpdata_utf8.sql

이런 형태로 utf8로 변환되지 못하는 모든 글자를 무시하고, utf8 문자셋으로 바꾸는 것입니다. 

그렇지 않고, 모든 잘못된 글자를 찾아서 바르게 고쳐서 변환하면 되겠죠.
iconv 에서 -c 옵션을 빼면 요즘 iconv 놈은 어디서 그런 문제가 있는지 친절하게 알려주네요. 
iconv 버전이 낮아서 그렇지 못하다면, 알아서 잘 이 문제를 풀어가야합니다. 


4. 다음은 일반적인 데이터베이스 복원 작업을 진행하면 됩니다.

김상기(ioseph)님이 2007-03-06 14:18에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7073[급함]다시한번 질문 드립니다. [1]
나그네
2007-03-10
4143
7072잔액 계산을 하는 쿼리 질문입니다. [1]
가우나라
2007-03-06
4480
7071쿼리 질문입니다. [1]
조진우
2007-03-06
4580
7070PostgresSQL 7.3 -> 8.2.3 업그레이드 시 encoding error [1]
무적초보
2007-03-05
7385
7069트리거는 어떻게 해야하는지.. [1]
스치는인연
2007-03-02
4521
7067해당 필드에 유니코드데이타가 들어있는지 아는 방법? [5]
dba
2007-02-28
5596
7066퍼미션 문제 [1]
조수한
2007-02-28
4345
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다