본문 바로가기

『IT/개발』/MySQL

[MySQL] SET 타입 INSERT, SELECT 활용법

MySQL SET Type

MySQL SET 타입의 컬럼을 많이 사용하시죠?

저 또한 자주 사용하는 타입인데요.

좀 더 SET 타입을 편리하게 활용할 수 있는 소소한 팁을 알려드리겠습니다.


예를 들어서 설명하도록 하겠습니다.

["월", "화", "수", "목", "금", "토", "일"] 이렇게 SET 타입이 정의가 되었습니다.

컬럼이름은 `Week` 라고 하도록 하겠습니다.


INSERT 시에 활용 법

방법 1 : 가장 기본적인 방법입니다.

INSERT INTO `테이블명`(`Week`) VALUES ("월, 화, 수, 일") ;

이 방법은 머 다로 설명이 필요 없어도 되겠죠?


방법 2 : 10진수로 저장하는 방법

INSERT INTO `테이블명`(`Week`) VALUES (71) ;

위와 같이 71라는 10진수 값을 넣으면 컬럼에는 실제로 "월, 화, 수, 일" 이렇게 저장이 될 것입니다.

이유를 살펴 보면 SET 컬럼에 정의 된 요일이 각각 10진수의 값을 가지고 있기 때문입니다.

월: 1, 화: 2, 수: 4, 목: 8, 금: 16, 토: 32, 일: 64

위와 같이 말이죠.

그래서 71을 저장하면 "월, 화, 수, 일" 이라는 값이 저장되게 되는 것입니다.

아시겠죠?ㅎㅎ

"월, 화, 수, 일"10진수 값을 다 더하면 71이 됩니다.


SELECT 시에 활용 법

방법 1 : 10진수로 가져오기.

SELECT `Week`+0 FROM `테이블명`;

위와 같이 할 경우 저장된 SET 타입의 String 이 10진수 값으로 변경 되어 조회가 됩니다.

["월, 화, 수, 일"] 이라는 값이 저장되어 있다면 71이 출력되겠죠.


방법 2 : 2진수로 가져오기

SELECT REVERSE(LPAD(CONV(`Week`+0, 10, 2), 7, "0")) AS `Week` FROM `테이블명`;

쿼리만 봐서는 쫌 헷갈릴수도 있어요.

차근차근 설명을 드리겠습니다.


`Week`+0: 

10진수로 데이터를 가져온다는 말입니다. 71("월, 화, 수, 일") 이 나오겠죠.


CONV(`Week`, 10, 2): 

이것은 10진수2진수로 변환 한다는 것입니다.

712진수로 표현할 경우 : 1000111 이렇게 나옵니다.


LPAD(`Week`, 7, "0"): 

`Week` 의 스트링 길이가 7이 될때까지 앞에 "0" 입력하겠다는 것입니다.

LPAD 를 사용하는 이유는 자릿수를 맞추기 위해서 입니다.


REVERSE: 

2진수로 표현을 한 경우 오른쪽 맨 끝이 시작부분이 됩니다. 

저희는 왼쪽이 시작이죠? "월"!!!!

그렇기 때문에 REVERSE 를 사용해서 거꾸로 돌려놔야 합니다.

그러면 결과는???

1110001 이렇게 나오게 되겠죠?

["월", "화", "수", "목", "금", "토", "일"] 

자리에 맞게 선택된 요일은 1로 표현이 되었다는 것을 쉽게 알 수 있겠죠?


저의 설명이 쉽게 되었는지 모르겠네요.

아무튼 위 방법을 사용하시면 좀 더 편한 프로그래밍이 될 것 입니다.