11.4.2 BINARY 및 VARBINARY 형
BINARY
및 VARBINARY
타입은 CHAR
및 VARCHAR
형과 유사하지만, 비 바이너리 문자열이 아닌 바이너리 문자열을 저장합니다. 즉, 그들에는 문자열이 아닌 바이트의 문자열이 포함되어 있습니다. 이것은 그들에게 문자 세트가없고, 정렬 및 비교는 값 안의 바이트의 수치에 따라 의미합니다.
BINARY
및 VARBINARY
에서 허용되는 최대 길이는 CHAR
및 VARCHAR
의 경우와 동일하지만, BINARY
및 VARBINARY
길이가 문자가 아닌 바이트 단위로 표현되는 점이 다릅니다.
BINARY
및 VARBINARY
데이터 유형은 CHAR BINARY
및 VARCHAR BINARY
데이터 형과는 다릅니다. 후자의 형태는 BINARY
속성으로 컬럼이 바이너리 문자열 컬럼으로 취급되는 것은 아닙니다. 대신 이로 인해 열 문자 집합의 이진 데이터 정렬이 사용 된 컬럼 자체는 바이너리 바이트 스트링이 아닌 비 바이너리 문자열이 저장됩니다. 예를 들어, CHAR(5) BINARY
는 기본 문자 집합이 latin1
하면, CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin
로 처리됩니다. 이것은 문자 집합 및 데이터 정렬이없는 5 바이트의 이진 문자열을 포함하는 BINARY(5)
과는 다릅니다. 비 이진 문자열 이진 데이터 정렬과 이진 문자열의 차이에 대해서는 섹션 10.1.7.6 "_bin 및 binary 데이터 정렬" 을 참조하십시오.
엄격한 SQL 모드가 유효하지 않은 경우 BINARY
또는 VARBINARY
컬럼에 최대 길이를 초과하는 값을 지정하면 그 값은 컬럼의 최대 길이에 맞게 절단되고 경고 메시지가 표시됩니다. 값을 자르면 엄격한 SQL 모드를 사용하면 경고가 아닌 오류를 발생시키고, 그 값의 삽입을 억제 할 수 있습니다. 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.
BINARY
값은 저장되는 특정 길이까지 오른쪽 패드 값으로 채워집니다. 패드 값은 0x00
(0 바이트)입니다. 값은 삽입시에는 오른쪽이 0x00
으로 채워 선택할 때 후속 바이트는 제거되지 않습니다. 모든 바이트는 ORDER BY
및 DISTINCT
작업을 포함 비교에서 의미가 있습니다. 0x00
바이트와 공간은 비교에서 달리 0x00
<공간입니다.
예 : BINARY(3)
컬럼의 경우 'a '
는 삽입시에 'a \0'
이됩니다. 'a\0'
은 삽입시에 'a\0\0'
이됩니다. 선택시 삽입 된 두 값은 변경되지 않습니다.
VARBINARY
는 삽입시에 패딩되기도 선택할 때 바이트가 삭제 될 수 없습니다. 모든 바이트는 ORDER BY
및 DISTINCT
작업을 포함 비교에서 의미가 있습니다. 0x00
바이트와 공간은 비교에서 달리 0x00
<공간입니다.
후속 패드 바이트가 제거되거나 비교에서 무시되거나하는 경우는 고유 한 값을 필요로하는 인덱스 컬럼에 포함되어 있으면 후속 패드 바이트의 개수 만 다른 컬럼 값에 삽입 중복 키 오류가 발생합니다. 예를 들어, 테이블에 'a'
가 포함되어있는 경우, 'a\0'
을 저장하려고하면 중복 키 오류가 발생합니다.
바이너리 데이터의 저장에 BINARY
데이터 형을 사용할 계획이며, 꺼낸 값을 저장 한 값과 동일 할 필요가있는 경우는 선행 패딩 제거 문자를 고려해야합니다. 다음의 예는 BINARY
값 0x00
패딩하여 컬럼 값의 비교가 어떤 영향을 받는지 보여줍니다.
mysql>CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec) mysql>SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+ | HEX(c) | c = 'a' | c = 'a\0\0' | +--------+---------+-------------+ | 610000 | 0 | 1 | +--------+---------+-------------+ 1 row in set (0.09 sec)
추출 된 값을 패딩없이 스토리지에 지정한 값과 일치해야하는 경우, 대신에 VARBINARY
또는 하나의 BLOB
데이터 형을 사용하는 것이 좋습니다.