별것은 아니구요. 어떻게 하면 multibyte 개발자의 의도도 존중하면서 입력할 수 있게 할지 고민을 해봤는데요. 간단하게 해결된 것 같습니다. postgresql-7.4/src/backend/utils/mb/wchar.c 파일을 여시면 pg_verifymbstr()이라는 함수를 찾을 수 있습니다. 그 함수 중간에
ereport(ERROR, errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), errmsg("invalid byte sequence for encoding \"%s\": 0x%s", GetDatabaseEncodingName(), buf)));
이런 부분이 있습니다. 제 소스(postgresql_7.4)에서는 693번 줄이네요. 여기서 ERROR를 WARNING으로 바꿨습니다. ereport의 동작을 찾아보니 log level이 ERROR 이상일 때에는 작동을 멈추게 되어 있더군요. 그래서 한단계 낮추어서 WARNING으로 했습니다. 이렇게 하면 경고 메세지는 출력되지만 자료를 정상적으로 들어갑니다. 왜 개발자가 이 코드를 만들었는지 모르겠지만 이렇게 하면 만든 목적도 해치지 않는 것 아닌가 생각이 듭니다.
test=>create table test ( text text not null ); test=>insert into test values('아햏햏');
psql:xx.sql:1: WARNING: invalid byte sequence for encoding "EUC_KR": 0xc164 psql:xx.sql:1: WARNING: invalid byte sequence for encoding "EUC_KR": 0xc164 INSERT 66908 1
test=> select * from test; text -------- 아햏햏 (1 rows)
만약 메세지도 출력되기 원치 않는다면 log level을 낮추어 보십시오. log level 상수의 정의는 src/include/utils/elog.h에 있습니다. 예를 들어 DEBUG1이나 INFO로 낮추어도 될 것 같네요. DEBUG5가 가장 낮은 log level 입니다. 그럼 해보시고 의견 부탁합니다. |