[php] [mysql] SET 타입과 비트연산 사용하기

mysql의 SET 타입은 여러개의 값을 한번에 가질 수 있는 데이터 타입이다.

예를 들어 [관심분야 : A, B, C, D, E, F, ...] 가 있을 때 (복수선택 가능)
각각을 개별 칼럼에 저장하는 것보다는
하나의 칼럼에 합쳐서 저장하는 것이 검색기능에서 월등히 좋다.

DB에 저장할 경우에는 정수값을 할당하거나 텍스트 'A,C,E' 를 할당할 수 있다.
A = 1
A, B = 1 + 2 = 3
A, B, C = 1 + 2 + 4 = 7

이 값들은 결국 2의 제곱수 즉 bit 값이 된다.

SQL 질의문 예시 : 단순히 질의하는 경우

SELECT col_set FROM tbl_name;
// col_set = "A,B,C"; (문자열)

SELECT col_set+0 AS col_dec FROM tbl_name;
// col_dec = 7; (십진수)

SQL 질의문 예시 : 비트연산으로 조건검색을 하는 경우

SELECT * FROM tbl_name WHERE col_set & 1 > 0; // A를 포함한 경우
SELECT * FROM tbl_name WHERE col_set & 2 > 0; // B를 포함한 경우
SELECT * FROM tbl_name WHERE col_set & 4 > 0; // C를 포함한 경우
SELECT * FROM tbl_name WHERE col_set & 7 > 0; // A+B+C를 포함한 경우

PHP에서 사용하는 경우

if( (7 & 1) > 0 ) // 결과 true
if( (7 & 2) > 0 ) // 결과 true
if( (7 & 8) > 0 ) // 결과 false

* 주의 : 비트연산(&)을 반드시 괄호로 감싸줘야 함


관심분야 선택 기능을 위한 변수 생성

$col_array = array(
    1 => 'A',
    2 => 'B',
    4 => 'C',
    8 => 'D',
    16 => 'E',
    .... (2의 제곱수로 증가함)
);

# 관심분야를 선택하는 화면
foreach($col_array as $key=>$val) {
    if( ($db_value_dec & $key) > 0 ) {
        // 선택된 상태임
    }
}





댓글 없음:

댓글 쓰기

[SSL] [letsencrypt] [certbot] 와일드카드 인증서 발급하기

1. 환경   ubuntu 20.x  nginx 2. 설치   apt-get install letsencrypt -y  3. 인증서 발급   ; example.com 도메인에 대해 와일드카드 인증서를 발급받는다. certbot certonly --ma...