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진수로 변환 한다는 것입니다.
71을 2진수로 표현할 경우 : 1000111 이렇게 나옵니다.
LPAD(`Week`, 7, "0"):
`Week` 의 스트링 길이가 7이 될때까지 앞에 "0" 입력하겠다는 것입니다.
LPAD 를 사용하는 이유는 자릿수를 맞추기 위해서 입니다.
REVERSE:
2진수로 표현을 한 경우 오른쪽 맨 끝이 시작부분이 됩니다.
저희는 왼쪽이 시작이죠? "월"!!!!
그렇기 때문에 REVERSE 를 사용해서 거꾸로 돌려놔야 합니다.
그러면 결과는???
1110001 이렇게 나오게 되겠죠?
["월", "화", "수", "목", "금", "토", "일"]
자리에 맞게 선택된 요일은 1로 표현이 되었다는 것을 쉽게 알 수 있겠죠?
저의 설명이 쉽게 되었는지 모르겠네요.
아무튼 위 방법을 사용하시면 좀 더 편한 프로그래밍이 될 것 입니다.
'『IT/개발』 > MySQL' 카테고리의 다른 글
[MySQL] 시간(Time) 을 원하는 형식(format) 으로 만드는 TIME_FORMAT() 함수 (0) | 2015.02.07 |
---|---|
[MySQL] 초(second) 를 Time 형식으로 바꿔주는 SEC_TO_TIME() 함수 (0) | 2015.02.07 |
[MySQL] 쿼리문에 사용자 정의 변수 사용하기. (0) | 2014.12.09 |