MySQL에서 SET 타입 컬럼에 '+0'을 더하면 해당 SET 값이 정수(비트마스크 값)로 변환됩니다. SET 타입은 내부적으로 각 멤버를 비트(bit)로 관리하기 때문인데, 이를 숫자로 확인할 수 있는 아주 유용한 방법입니다.
예제 테이블 생성
먼저 예제로 사용할 테이블을 만들어 보겠습니다.
mysql> create table SetZeroDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> TechnicalSkills set('C','Spring Framework /Hibernate','Python','Django Framework','Core Java') NOT NULL
-> );
Query OK, 0 rows affected (0.56 sec)데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into SetZeroDemo(TechnicalSkills)
-> values('C,Spring Framework /Hibernate,Python,Django Framework,Core Java');
Query OK, 1 row affected (0.20 sec)저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from SetZeroDemo;
실행 결과는 다음과 같습니다.
+----+-----------------------------------------------------------------+ | Id | TechnicalSkills | +----+-----------------------------------------------------------------+ | 1 | C,Spring Framework /Hibernate,Python,Django Framework,Core Java | +----+-----------------------------------------------------------------+ 1 row in set (0.00 sec)
SET 값에 '+0' 적용하기
이제 SET 컬럼에 '+0'을 더하는 쿼리를 실행해 보겠습니다.
mysql> select TechnicalSkills+0 from SetZeroDemo;
결과는 다음과 같습니다.
+-------------------+ | TechnicalSkills+0 | +-------------------+ | 31 | +-------------------+ 1 row in set (0.00 sec)
왜 결과가 31일까?
MySQL의 SET 타입은 각 멤버를 왼쪽부터 오른쪽까지 비트 자릿수(2의 거듭제곱)에 매핑합니다. 위 테이블에는 5개의 기술이 정의되어 있으므로, 각 멤버는 20부터 24까지의 값을 가집니다.
모든 멤버가 선택되었기 때문에 각 비트 값을 모두 더하면 다음과 같이 계산됩니다.
=20+21+22+23+24 =1+2+4+8+16 =15+16 =31
즉, TechnicalSkills+0은 SET 문자열을 내부 비트 표현값인 31로 변환한 것입니다. 이처럼 '+0' 연산은 SET 값이 실제로 어떤 멤버들이 선택되었는지를 숫자로 빠르게 확인하고 싶을 때 유용하게 활용할 수 있습니다.