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 6572 게시물 읽기
No. 6572
유니코드에 관한 전반적인 질문입니다.
작성자
임기범
작성일
2006-03-09 14:24ⓒ
2006-03-09 14:24ⓜ
조회수
4,797

안녕하세요? DSN에 첫발을 내딛게 되었네요..

 

인포믹스와 오라클 등은 많이 써봤지만, PostgreSQL은 처음 써보는지라

아주 초보적인 질문이 될 수도 있겠지만 좋은 답변 기대합니다. ^^

 

PostgreSQL을 처음 써봐서 그런지 게시판을 아무리 뒤져봐도 별 효과가 없는 듯 해서 질문 올립니다.

개발환경은 리눅스 2.6.9, PostgreSQL 7.4.8 사용하고 있습니다.

 

1. 유니코드와 uhc가 서로 다른 건가요?

insert into aa values ('가나다');

이 문장을 보내는데 client encoding이 유니코드로 되어 있을때는 명령어 입력(실행)이 안되고, uhc로 바꾸니까 되더군요.. 차이점이 무엇인지...

 

2. 위 insert 문장을 실행하고 나서 길이를 체크해 보니 이상한 현상이... 한글이 세바이트 인가요?

testsvr=# select a, length(a), octet_length(a) from aa;
a | length | octet_length
--------+--------+--------------
12345 | 5 | 5
가나다 | 3 | 9
(2 rows)


3. 마지막으로... (사실은 이게 본론.. ^^)

제가 하려는건 모든 데이터를 유니코드로 저장하려고 하는 겁니다.

즉, 한글 등은 물론이거니와 영문이나 숫자의 경우도 2바이트 문자로 입출력하고자 하는 거죠..

위의 경우 '12345'의 경우도 octet_length를 구했을때 10이 나올 수 있도록...

이렇게 할 수 있는 방법이 있을까요? 있다면 어떻게 하면 되는지...

 

 

많은 분들의 답변 기대하겠습니다.

남은 하루도 즐거운 시간들 보내시길~~ ^^

 

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

PostgreSQL에서의 유니코드라는 문자셋은 엄격히 말해서, utf-8 코드입니다.

 

그래서, 8.1부터는 unicode라 하지 않고, utf-8로 구체적으로 명시했습니다.

 

utf-8 코드는 서양권 문자는 1byte, 한글은 3byte로 저장됩니다.

 

그리고, PostgreSQL의 length() 함수는 그 문자열의 byte수를 계산하는 것이 아니라, '글자'수를 계산하는 함수입니다.

즉, length('abc') = length('가나다')가 성립됩니다. 똑같이 3입니다.

 

마지막 입출력에서 2byte 출력을 원하면, A-Z0-9 문자에 대해서 2byte 처리를 하려면, 일단 uhc 전각문자로 변환하는 함수 하나를 만드셔야할 것같네요.

 

김상기(ioseph)님이 2006-03-09 21:27에 작성한 댓글입니다.

상기님의 답변 잘 보았습니다. 감사합니다.

 

추가로... 일단 1번 질문 중에 client_encoding이 유니코드로 되어 있을때는 왜 insert 문장이 실행이 안된건지요...

증상은 어떠했냐 하면요...

prompt 상태에서 ' 문자를 입력하면 줄 바뀜 뒤 추가 입력을 기다리는 듯한 상태로 되거든요..

왜 그런건지.. 그리고 그 상태에서 제가 Ctrl+C 로 빠져 나왔는데 그렇게 나와도 되는건지.. (psql 자체를 빠져 나온건 아니구요, 방금 말씀드린 문자 입력 대기 상태.. sql 문 자체가 실행 되거나 하진 않습니다)

 

두번째로...

한글이 세바이트다?? 이건 좀 놀랍네요.. 어떤 이유가 있는건지...

제가 지금 샘플로 프로그램을 하나 작성해서 프로그램에서 읽어봐도 역시 3바이트로 리턴이 되더군요...

영숫자의 경우에는 전각문자로 변환하는 함수를 작성한다고 해도, 한글의 경우 3바이트를 2바이트로 처리할 수 있는 방법은 없는 건가요?

다른 분들은 모두 PostgreSQL을 사용하시면서 한글 3바이트를 감안하고 사용하시는지....

 

바쁘시겠지만 추가 답변 부탁드립니다.

모두들 오늘도 즐거운 하루 보내시길~ ^^

 

임기범님이 2006-03-10 11:21에 작성한 댓글입니다. Edit

윈도우신가요 유닉스 계열인가요?

쉘의 특성이나 환경 변수에 따라 사용할 수 있는 클라이언트 인코딩이 한정적일 수 있습니다

 

리눅스라면요

유니코드 DB에 들어갈 때 export LANG=ko_KR.utf8 이걸로 실행환경을 맞춰주고 들어가면 정상적으로 됩니다. 물론 터미널 프로그램이 유니코드를 표시할 수 있어야겠죠

echo $LANG 해보셔서 현재 쉘의 환경을 보셔도 되구요. 이 값이 ko_KR.eucKR 이시라면 psql로 들어갔을 때 \encoding uhc 등을 해주셔야 한글 입출력이 제대로 됩니다.

이것은 pgsql의 문제라기 보다는 실행환경의 차이에 따라 발생하는 문제입니다.

 

한글은 2~3 바이트입니다. utf-8의 경우 종성이 있다거나 하면 최대 3바이트까지 차지할 수 있고요. 유니코드의 여러가지 이점 때문에 감안하고 사용하고 있습니다. 말씀하신대로 "변환하는 함수가 있다면" 2바이트로도 처리할 수 있을겁니다. ㅎ

신기배(소타)님이 2006-03-10 11:35에 작성한 댓글입니다.

신기배님이 말씀하신 것처럼 클라이언트 터미널 환경이

ko 일경우는 db가 utf-8 이면 클라이언트의 인코딩을 uhc로

바꿔줘야 하는게 맞습니다.

 

자세한것은 신기배님 답변물을 잘 읽어보시면 될 듯 하고요.

--

저 역시 utf-8 가 가지는 이점이 있어 글자당 3바이트를 감안하고

사용합니다.^^

이상호(search5)님이 2006-03-14 14:43에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6578트리거에 대해서 질문좀 드립니다. [4]
아즈샤라
2006-03-17
2568
6576특정 테이블이 있는 지 검색 show tables ??? [3]
김명범
2006-03-14
3448
6574300만개의 데이터 처리 [3]
곽상옥
2006-03-11
2830
6572유니코드에 관한 전반적인 질문입니다. [4]
임기범
2006-03-09
4797
6571Windows 에서 postgresql 설치시.. 궁금합니다 [1]
지호
2006-03-08
2617
6570Embedded XP에서 Postgre 깔때... [1]
김성식
2006-03-08
2231
6567postgres.exe 프로세스가 많이 떠있어요.... [2]
백두산
2006-03-07
2983
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.047초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다