MySQL 바이너리 데이터 저장 문제와 해결 방법
MySQL에서 바이너리 데이터를 다룰 때는 BIT 데이터 타입을 사용하는 것이 가장 적합합니다. 일반적인 숫자형 타입과 달리 BIT 타입은 비트 단위의 값을 그대로 저장할 수 있어, 바이너리 데이터를 효율적으로 관리할 수 있습니다.
다만 주의할 점이 있습니다. BIT 타입으로 저장된 값은 일반적인 SELECT 문으로 조회하면 화면에 제대로 표시되지 않는다는 것입니다. 이 경우 BIN() 함수를 사용해야 실제 비트 값을 확인할 수 있습니다.
1. BIT 타입 테이블 생성하기
먼저 BIT(5) 타입의 컬럼을 가진 테이블을 생성해 보겠습니다.
mysql> create table DemoTable(binaryValue BIT(5)); Query OK, 0 rows affected (0.83 sec)
2. 데이터 삽입하기
INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable values(10); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable values(15); Query OK, 1 row affected (0.15 sec)
3. 일반 SELECT로 조회하면 값이 보이지 않습니다
SELECT 문으로 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과를 보면 레코드가 존재하는데도 불구하고 값이 화면에 나타나지 않습니다.
+-------------+ | binaryValue | +-------------+ | | | | +-------------+ 2 rows in set (0.00 sec)
이것은 오류가 아니라, BIT 타입의 값이 바이너리 형태로 저장되기 때문에 일반적인 출력 방식으로는 사람이 읽을 수 없기 때문입니다.
4. BIN() 함수로 바이너리 값 확인하기
저장된 바이너리 데이터를 실제로 확인하려면 BIN() 함수를 사용해야 합니다.
mysql> select bin(binaryValue) from DemoTable;
이제 10진수 10은 1010, 15는 1111이라는 2진수 값으로 정상적으로 출력됩니다.
+------------------+ | bin(binaryValue) | +------------------+ | 1010 | | 1111 | +------------------+ 2 rows in set (0.00 sec)
5. b'...' 표기법으로 직접 삽입하는 예제
MySQL에서는 b'1010'처럼 비트 리터럴 표기법을 사용해 바이너리 값을 직접 삽입할 수도 있습니다.
mysql> insert into DemoTable VALUES (b'1010'),(b'1111'); Query OK, 2 rows affected (0.52 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select *from DemoTable; +-------------+ | binaryValue | +-------------+ | | | | | | | | +-------------+ 4 rows in set (0.00 sec)
역시 일반 SELECT 문으로는 값이 보이지 않습니다. BIN() 함수를 사용해 다시 확인해 보겠습니다.
mysql> select bin(binaryValue) from DemoTable;
모든 레코드가 2진수 형태로 정확하게 출력되는 것을 확인할 수 있습니다.
+------------------+ | bin(binaryValue) | +------------------+ | 1010 | | 1111 | | 1010 | | 1111 | +------------------+ 4 rows in set (0.00 sec)
정리
- MySQL에서 바이너리 데이터를 저장할 때는 BIT 데이터 타입을 사용합니다.
- BIT 타입의 값은 일반 SELECT 문으로 조회하면 화면에 표시되지 않습니다.
- 저장된 값을 확인하려면 BIN() 함수를 사용해 2진수 형태로 변환해야 합니다.
b'1010'과 같은 비트 리터럴 표기법으로도 값을 삽입할 수 있습니다.