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 4705 게시물 읽기
No. 4705
트리거, plpgsql, char & varchar 에 대한 질문
작성자
디짓(digitie)
작성일
2003-05-14 16:04
조회수
2,367

MySQL만 써보다가 PostgreSQL을 쓰니 MySQL에는 없는 새로운 개념이 너무 많아서 머리가 부서질 지경입니다만...

 

그래도 MySQL에서 골머리 앓았던 문제들을 너무 쉽게 해결할 수 있어서 MySQL때 보다 잔머리 굴리는 일은 훨씬 적군요 ^^;

 

MySQL때 보다 확실히 편한 것 중 하나가 트리거인데 노동이 반으로 준 것 같습니다. 근데 트리거 문법을 보면 사용자가 만든 함수만을 불러올 수 있네요.

 

트리거로 땡길게 UPDATE문 한줄인데 따로 함수를 만들어 래핑해야만 하는지 궁금합니다. 트리거에서 바로 UPDATE를 땡기게 할 순 없는지요.

 

그리고 PL/pgSQL에 대한 질문입니다. 파라미터를 받을 때 integer, text등으로만 받을 수 있는지 궁금하네요.

 

받으려는 인수가 범위가 한정되어 있어서 varchar(255)로 받으려고 하는데 인수 타입이 unknown이라면서 실행이 안되더군요.

 

PostgreSQL cookbook pages 에 보아도 인수를 모두 integer, text 등으로 받아오더군요.

 

데이터의 범위가 정해져 있는 경우에 text 타입을 쓰는건 비효율적이라는 생각이 드네요 :(

 

마지막 질문 입니다.

 

MySQL에서는 char이 varchar보다 검색할 때 더 빠르다고 하던데PostgreSQL에서도 그런지 궁금합니다.

 

여담입니다만...

 

MySQL에 비해서 postgresql 자료를 구하기가 너무 힘드네요...

그나마 db사랑넷이라도 있어서 다행입니다 :)

 

큰맘먹고 postgresql 메일링리스트에 모조리 가입해서 보려고 하고는 있는데 하루에 쏟아지는 메일이 100통이 넘는 덕분에 초짜에겐 제목만 훑어보는 것도 힘들군요 ㅠㅠ

 

답변에 미리 감사드립니다. ;-)

즐거운 하루 되시길.

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

PostgreSQL 놈의 유혹에 이제 빠져 보실려고 하나봅니다. :)

 

문제는 PostgreSQL을 잘(?) 만지는 분들은 대부분 자기가 하고 있는 일들이 바쁜 사람들인지, 입문자/중급자들을 위한 배려가 별로 없습니다. 저 또한 마찬가지고.

 

트리거의 update 구문에 대한 이야기는 plpgsql의 '동적쿼리'부분을 살펴보시면 해결이 날 듯싶습니다.

 

plpgsql의 사용자 정의 함수에서의 varchar 인수는 일반적으로 text로 변환되어서 넘겨주면 됩니다.

 

PostgreSQL에서는 varchar 자료형이 내부적으로 text 자료형으로 처리되거든요. varchar(10) 이놈은 text 자료형인데, 그 길이를 10으로 제한 한다는 것 빼고는 전혀 차이가 없습니다. 따라서 PostgreSQL에서는 문자열 자료형으로 text 형 하나로 모든 것이 끝나는 꼴입니다. char(1) 이놈과 text (가변길이 문자열)과의 속도 문제는 1-10 ms 정도의 차이입니다. 실무에서 이것에 대한 속도는 당연히 무시해도 되겠지요.

 

PostgreSQL 놈은 MySQL 놈하고 비교했을때, db를 만지는 사람이 알아야할 것이 제법 많습니다. (그만큼 많은 일을 db에서 해낼 수 있다는 것이겠지요)

 

PostgreSQL 메뉴얼을 필요하실 때마다 차근히 읽어보시면 많은 도움이 될것입니다.

 

또한 문제가 안풀리면 이곳을 이용하셔도 될터이고,

또한 문제를 어렵게 풀었다면, 그 정보를 이곳에서 같이 나누셔도 좋을 터이고...

김상기(ioseph)님이 2003-05-15 11:36에 작성한 댓글입니다.

<text 찬미>

 

char

varchar

text

 

세개의 문자열자료형중에 char은 용도가 다르죠.

제주변엔 일부러 써보려해도 그자료형을 써야하는경우가 없어 써보질못했음니다.

 

실제 그런형태의 자료형이 왜필요하는지,왜생겨났는지 모르겠군요. 문자열의 아주특이한형태죠.

 

전varchar와 text형의 경우엔 외에없이 text을씀니다.

보통 문자제한이 필요한경우는 길이뿐아니라 문자열형식이나 포함될문자종류도 같이 제한할경우가 많은데 이땐 check를 쓰면 효과적으로 제어되죠.

mysql의 enum,unsigned형의 자료형도 손쉽고 더다양하게 구현할수도 있구요.

흔히쓰는 id,passwd형식검사등도 스키마차원에서 거의 끝나구요.

 

varchar를 습관적으로쓸때 보통 나타나는 길이제한이 사실 왜 그크기인지 명확히 이유도 없어 대략 이정도쯤 해서 정하는경우가 많은데

이게 스키마를 어지럽히는 요인이된다고 개인적으로 생각함니다.

명확히 크기가 제한되어야하는 경우와 그럴필요가 없는 필드가 식별이 않되고

주위상황이변해 크기를 조절해야할경우 어플리케이션이 힘들어지죠.

 

너무 편협된생각인가요?

 

어째든 전 text의 자유로움과 간결함 거기에 check의 강력하고도 유현한기능을 더해쓰면 문자열관련 자료형은 어프리케이션의 일부몫까지 해결해주는 문자형태자료형에선 좋은선택이라고봄니다.

황치영(gau)님이 2003-05-15 23:11에 작성한 댓글입니다.

varchar이 내부적으로 text로 처리가 된다는 말이 _처리_만을 text로 한다는 것인지 칼럼의 형식 또한 text로 처리된다는 말인지 확실히 구분이 가지 않네요 ^^;;

 

gau님께서 text를 찬미하셨는데 궁금한점이 한가지 있습니다. varchar을 쓰는 이유중 하나가 자료형의 길이 제한도 있지만 전체적인 테이블의 크기를 제한한다는 측면도 있는 것 같습니다. (자료가 많이 쌓이면 차이가 조금씩 커지겠지요)

 

text에 check constraint로 길이 제한을 걸면 일단 사용자 입장에서는 varchar과는 차이가 없어 보입니다만 db쪽에서는 어떤지 궁금합니다.

 

text 가 주는 어감때문인지 text쪽이 부하가 많이 걸릴 것 같아 보이네요 :-)

 

덧. postgresql에 오니 모든 게 새롭군요;

디짓(digitie)님이 2003-05-15 23:51에 작성한 댓글입니다.

char 자료형을 사용하는 것은

char(10) 에서 필드에 'a' 만 입력하고, db에서 꺼집어내면, 'a_________' (a 하고, 9개의 공백문자로 채워집니다)

 

이놈은 예전 콘솔모드( 터미널 모드)에서는 sprintf 와 같은 기능을 하기 때문에 아주 유용하게 사용되어집니다.

그래서 아직까지도 존재하는 자료형인 것 같습니다.

 

-------

 

varchar와 text 이야기에서,

PostgreSQL 놈의 내부를 깊숙이 알고 싶으시면 소스를 보시면 됩니다. :)

 

PostgreSQL에서의 가변길이 문자열은 서버차원에서는 text 형 밖에 없습니다.

사용자가 스키마를 정의할 때, varchar(10)이라고 정의하면 서버는 그 필드는 'text형인데, 그 길이 제한을 10으로 한다'고 처리할 뿐입니다.

 

즉,

name varchar(10) 이놈은

name text check(length(name) < 11) 하고 같지요.

 

물론 스키마 차원에서 본다면, 엄격히 다른 것인 것처럼 보이지만, 서버의 문자열 처리 루틴상에서는 완벽하게 동일합니다.

 

PostgreSQL놈을 주로 사용하는 사람들의 공통된 생각이 varchar() 자료형이 무용성(?) 입지요.

김상기(ioseph)님이 2003-05-16 10:32에 작성한 댓글입니다.

상세한 답변 감사합니다 (__)

 

덧. MySQL의 경우 char이 유용하게 쓰입니다. 검색할 때 varchar보다 빠른 결과를 보여준답니다 :)

디짓(digitie)님이 2003-05-16 11:55에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4709make, initdb 등의 명령어가없습니다.
강구환
2003-05-15
1108
4707[질문]window 2000에서 PostgreSQL7.3.1 사용방법알려주셔요 [1]
김선훈
2003-05-15
1352
4706오라클9i에서 PgSQL로 이전할려구합니다... [1]
이상부
2003-05-15
1726
4705트리거, plpgsql, char &amp; varchar 에 대한 질문 [5]
디짓
2003-05-14
2367
4703아스키 정렬문제... [2]
디짓
2003-05-12
1495
4702select에서 건수 문제... [1]
system69
2003-05-10
1355
4704┕>Re: select에서 건수 문제... [1]
system69
2003-05-12 09:40:11
1248
4701pg_dumpall 에서 owner 관련 메세지 [1]
성혁
2003-05-10
1535
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다