일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- redis
- Spring
- php
- laravel
- JVM
- jenkins
- javascript
- MySQL
- db
- devops
- ReactJS
- Web Server
- Oracle
- it
- Design Patterns
- AWS
- java
- Spring Batch
- 요리
- linux
- elasticsearch
- Gradle
- Spring Boot
- tool
- ubuntu
- 맛집
- IntelliJ
- jsp
- springboot
- Git
Archives
- Today
- Total
아무거나
[mysql] 비트연산자을 이용한 db 필드를 flexible 하게 관리하는 방법 본문
반응형
비트연산자
비트 연산자는 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 수행합니다. 또한, 비트 단위로 전체 비트를 좌측이나 우측으로 이동시킬 때도 사용합니다. (연산자 우선순위대로 나열 &가 우선순위 1등)
- & (AND 연산): 대응되는 비트가 모두 1이면 1을 반환함.
- | (OR 연산): 대응되는 비트 중에서 하나라도 1이면 1을 반환함.
- ^ (XOR 연산): 대응되는 비트가 서로 다르면 1을 반환함.
- ~ (NOT 연산): 비트를 1이면 0으로, 0이면 1로 반전시킴.
- << (Left Shift 연산): 지정한 수만큼 비트를 전부 왼쪽으로 이동시킴.
- >> (Right Shift 연산): 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴.
[Example]
MySql에서 제공하는 필드의 수는 제한이 있고 필드가 너무 많아지면 관리비용이 늘어납니다. 또한 특정 데이터의 상태 필드가 추가될때마다 서버점검을 해야되는 번거로움이 생깁니다.
그것들을 막기위하여 한 필드의 비트연산을해서 여러개의 상태값을 표현할 때 유용하게 쓰입니다. 그러나 통계/집계를 뽑아낼때나 검색이 빈번해서 성능이 중요한 요소라면 정규화 하는 것이 좋다. (ex: 상태값 더할 때는 '|', 상태값을 뺄때는 '&')
// 출력: 8
// 첫 번째 비트만이 둘 다 1이므로, 연산 결과는 b'1000'이 됨.
SELECT b'1000' & b'1111';
// 출력: 15
// 모든 비트에 하나라도 1이 포함되어 있으므로, 연산 결과는 b'1111'이 됨.
SELECT b'1000' | b'1111';
// 출력: 7
// 첫 번째 비트를 제외한 모든 비트가 서로 다르므로, 연산 결과는 b'0111'이 됨.
SELECT b'1000' ^ b'1111';
// 출력: 6
// 모든 비트를 1비트씩 오른쪽으로 이동시키므로, 연산 결과는 b'0110'이 됨.
SELECT b'1100' >> 1;
// 출력: 3
// 모든 비트를 2비트씩 오른쪽으로 이동시키므로, 연산 결과는 b'0011'이 됨.
SELECT b'1100' >> 2;
// 출력: 3
// 1의 2진수는 001, 2의 2진수는 010 이며 둘의 OR 연산은 011 이므로, 10진수로 변환하면 3이므로 연산 결과는 3이 된다.
SELECT 1 | 2;
// 출력: 7
// 3의 2진수는 11, 4의 2진수는 100 이며 둘의 OR 연산은 111 이므로, 10진수로 변환하면 7이므로 연산 결과는 7이 된다.
SELECT 3 | 4;
// 출력:
// 15의 2진수는 1111, 12의 2진수는 1100 이며 비트연산자 우선순위의 의하여 12 & 15가 먼저 연산되고 그 후 둘의 XOR 연산은 0011 이므로, 10진수로 변환하면 3이므로 연산 결과는 3이 된다.
SELECT 15 ^ 12 & 15;
위의 'b'를 붙이는 이유는 MySQL에서는 '0'과 '1'로 이루어진 문자열 앞에 'b'를 붙이면 2진수를 표현할 수 있다.
- 10진수 -> 2진수 변환
- 코드값 예시
// 코드값이 7까지 있을 때
0
1
2
3 (1, 2)
4
5 (1, 4)
6 (2, 4)
7 (2, 3, 4)
// 코드값이 15까지 있을 때
0
1
2
3
4
5 (1, 4)
6 (2, 4)
7 (1, 2, 4)
8
9 (1, 8)
10 (2,8)
11 (1, 2, 8)
12 (4, 8)
13 (1, 4, 8)
14 (2, 4, 8)
15 (1, 2, 4, 8)
반응형
'Data Store > DB' 카테고리의 다른 글
[mysql] BINARY를 사용한 대소문자 구분 조회 (0) | 2019.04.11 |
---|---|
[mysql] UPDATE ~ CASE 문을 사용한 조건별 업데이트 (0) | 2019.04.11 |
[mysql] 엑셀로 되어있는 부분 db로 import하는 방법 (0) | 2019.03.08 |
[mysql] 하나의 쿼리로 여러 테이블의 데이터 삭제 (0) | 2019.02.22 |
[mysql] 서로 다른 결과를 한줄로 합쳐서 보여줘야 할 때(GROUP_CONCAT) (0) | 2019.02.15 |
Comments