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