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 5488 게시물 읽기
No. 5488
BIT 타입과 비트연산
작성자
초보
작성일
2004-08-21 20:59
조회수
3,980

<pre>

이 글은 질문성 이라기 보다 그냥 느낀 점입니다.

 

비트타입이라는게 있는데요 이것이 얼마나 유용하게(?) 쓰일까 하는 것인데요

 

표현해야 할 것이 많아지면 컬럼수도 많아집니다.

특히 컬럼의 유동성을 가질 경우 일일이 ALTER 를 이용할수도 없고 불편하기 짝이 없습니다.

그런데 다행이도 pgsql 에서는 배열타입을 지원해줘서 위와 같은 경우 상당한 도움을 줍니다.

이 중 정수형 배열컬럼중에서, 각 요소들이 1 과 0 으로(on/off 만 있는) 이루어진 배열이라면

배열보다는 차라리 BIT 형을 쓰는것이 좋을지도 모릅니다.

 

그런데 '1100'::bit(3) 을 하면 상식적으로 100 이 나올줄 알았는데 110 이 나오는군요..

그래서 해당비트의 유무판단이 좀 애매하네요.

특히 비교대상의 비트수가 같지 않으면 안 되기도 합니다.

더군다나

1100 이라는 비트가 있을때, 3번째 비트를 비교할때

substr (될런지 모르겠네요) 등으로 뒤에서 3번째 문자열(?)을 취해야 하는데 귀찮고요..

 

또, 십진수 -> 이진수 로 변환한것과 비트 -> 정수형으로 변환한 것에는 차이가 있네요

예로 2 는 10(2) 인데

B'10'::int 하면 2 가 나올겁니다. 그런데

bit 0 가 1이고 bit 1 이 0입니다.

실제 2 라는 숫자는 bit 1 이 1이고 bit 0 가 0 인데요..

상당히 불편하지 않을 수 없네요

 

차라리 비트타입을 쓰지 않고 정수형 타입을 써 보았습니다.

 

비트연산 무지 잘 되네요

예로 bit 컬럼(integer 타입)에서 bit 4 (5번째비트) 가 1 인것을 가져올려면

select * from tb where (bit & (1 << 4)) > 0;

이런식으로 비트연산(?)을 직접 사용해도 전혀 문제없이 잘 나오는군요

원하는 비트 셋팅도 아주 쉽고요

select 5 |= (1 << 2);

|, & 그리고 << 를 이용하면 아주쉽게 조작이 가능하군요..

 

비트타입이 필요할때 그냥 정수형으로 하고 이렇게 비트연산을 하면 좋겠네요

 

그럼다면.. 이 BIT 타입이 과연 쓸만할까요?

</pre>

 

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

bit 연산자는 7.2 (?) 버전에서 등장해서 7.4 에서 테스팅을 한참하고, 8.0에서 어느 정도 그 정책이 마무리 지은듯합니다.

 

그래서 비트 자료형 - 정확히 표현하면 비트문자열 자료형이 되겠지요 - 의 표현, 처리 하는 부분에서 그 정책적인 부분이 7.4 버전까지도 이랬다 저랬다 하는 부분이 많았습니다. 버그도 몇가지 있었고. 한마디로 실험적인 자료형이라고 설명하는 것이 가장 타당할듯싶네요. 이와 마찬가지로 현재 bytea 자료형도 그 문제를 안고 있는데. 이놈도 어떤 버그가 숨어 있을지 모르는 일입니다. 아무튼. bit 자료형만가지고 이야기하면, 8.0 기준으로 이야기를 해야지 바르게 설명할 수 있을 것같네요.

 

1. bit(n) 일 경우 입력이 초과하면, 오른쪽이 짤리고, 미달하면, 오른쪽이 0으로 채워집니다. 이는 sql 표준이랍니다. 즉, 윗 표현

>> '1100'::bit(3) 을 하면 상식적으로 100 이 나올줄 알았는데 110 이 나오는군요

정상적인 결과입니다.

참고문서: http://candle.pha.pa.us/main/writings/pgsql/sgml/datatype-bit.html

 

2. bit 자료형 연산의 대부분은 그 대상 값이 반드시 같은 자리숫 자료형이어야만 가능합니다. 이부분은 앞으로도 바뀌지 않을 것 같네요. 연산을 하려면, 먼저 연산 대상이 되는 자료형의 자리수를 확인해야할 듯 싶네요.

 

비트 연산에서 몇번째 값이 1이냐 0이냐를 구해내는 방법은 전통적으로 and 연산을 사용합니다.

 

 

mydb=# select (B'1100' & B'0010') = B'0010';
 ?column?
----------
 f
(1 row)
Time: 2.481 ms
mydb=# select (B'1110' & B'0010') = B'0010';
 ?column?
----------
 t
(1 row)

 

3. bit 자료형이 진수 변환 문제는 8.0에서 버그가 잡혔습니다. 7.4.5에서  반영되지는 않았네요, 아무튼 8.0 버전에서는 바르게 움직입니다.  아울러 8.0에서 바뀐 것이, bit 자료형으로 변환 되었을 경우 자리수가 넘처나면, 오른쪽 부분이 잘렸던 것을 왼쪽부분을 자르기로 했답니다. - 이 부분은 이해가 안되는 부분인데, 앞으로 그렇게 하기로 했다고 하네요. :(

template1=# select 6::bit(4);
 bit
------
 0110
(1 row)
template1=# select 6::bit(2);
 bit
-----
 10
(1 row)

 

4. 전통적인 C 프로그래머 출신이라면, bit 연산에 비교적 익숙할 터이고 진수 변환이 자유로울터이니, 단지 정수형 자료와 bit 연산자 만으로 충분히 원하는 작업을 할 수 있을 것입니다. 그런데, 왜 bit 문자열 자료형을 만들어서 오히려 더 헛갈리게 만드는가? 라고 질문한다면, PostgreSQL의 특유의 실험정신 때문이다고 답할 수 밖에 없을 것 같네요.  정수를 비트 문자열로 나타내고 그것은 직관적으로 보여주고, 연산한다는 것도 또 다른 매력일듯싶습니다. 문제는 버그가 많다는 것이 문제겠지만.

 

5. 이번에 또 8.0에서 Composite Type 이라고 우리말로 어떻게 옮기는 것이 타당할지는 모르겠지만, 아무튼 꼭 객체지향 언어의 object 같은 자료형이 새롭게 사용될 예정입니다. 이놈 또한 얼마나 많은 버그가 숨어 있을지, 또 얼마나 많은 정책이 바뀔지 의문입니다. 하지만,  PostgreSQL의 그 한계에 도전한다는 그 실험정신을 높이 사야지 않을까요? - 실무관계자들에게는 별로 반가운 소리가 아닐지라도.

김상기(ioseph)님이 2004-08-21 22:23에 작성한 댓글입니다.
이 댓글은 2004-08-21 23:11에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
5492데이터베이스 용어 표준안 문제 [7]
김상기
2004-08-22
3191
5491LTREE 에 대해 아시는분? [3]
초보
2004-08-22
1905
5490PostgreSQL 8.0 에 즈음하여.. [4]
young
2004-08-22
2172
5488BIT 타입과 비트연산 [1]
초보
2004-08-21
3980
5487데이터 베이스 동기화에 관하여.. [1]
이동규
2004-08-20
2542
5486win 2000 설치에러..., [3]
박찬한
2004-08-19
1992
5485[급질문]서블릿에러 too many connection..... [1]
크랜
2004-08-19
1730
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2025 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v17.4로 자료를 관리합니다