Loading...
MySQL 9.5 Reference Manual 9.5의 13.3.3 The BINARY and VARBINARY Types의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
BINARY와 VARBINARY type은 이진 문자열을 저장한다는 점을 제외하면 CHAR 및 VARCHAR와 유사합니다. 즉, 문자열이 아니라 바이트 문자열을 저장합니다. 이는 이들이 binary 문자 집합과 정렬을 가지며, 비교와 정렬이 값 내 바이트들의 숫자 값에 기반함을 의미합니다.
허용되는 최대 길이는 BINARY와 VARBINARY에 대해 CHAR 및 VARCHAR와 동일하지만, BINARY 및 VARBINARY의 길이는 문자 개수가 아니라 바이트 단위로 측정됩니다.
BINARY 및 VARBINARY 데이터 타입은 CHAR BINARY 및 VARCHAR BINARY 데이터 타입과는 구별됩니다. 후자의 타입에 대해서는, BINARY 속성이 컬럼을 바이너리 문자열 컬럼으로 취급하게 만들지는 않습니다. 대신, 컬럼 문자 집합(또는 컬럼 문자 집합이 지정되지 않은 경우 테이블 기본 문자 집합)에 대해 바이너리(_bin) 정렬이 사용되도록 만들며, 컬럼 자체는 바이너리 바이트 문자열이 아니라 비바이너리 문자 문자열을 저장합니다.
예를 들어, 기본 문자 집합이 utf8mb4인 경우, CHAR(5) BINARY는 CHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin으로 처리됩니다. 이는 binary 문자 집합과 정렬을 가지는 5-byte 바이너리 문자열을 저장하는 BINARY(5)와는 다릅니다. binary 문자 집합의 binary 정렬과 비바이너리 문자 집합의 _bin 정렬 사이의 차이에 대한 정보는 Section 12.8.5, “The binary Collation Compared to _bin Collations”을 참조하십시오.
strict SQL 모드가 활성화되어 있지 않은 상태에서 BINARY 또는 VARBINARY 컬럼에 컬럼의 최대 길이를 초과하는 값을 할당하면, 값은 맞게 잘려(truncate) 경고가 생성됩니다. 잘림이 발생하는 경우, 경고 대신 에러가 발생하도록 하고 값의 삽입을 억제하려면 strict SQL 모드를 사용하십시오. Section 7.1.11, “Server SQL Modes”을 참조하십시오.
BINARY 값이 저장될 때에는, 패딩 값으로 지정된 길이까지 오른쪽이 채워집니다. 패딩 값은 0x00(zero byte)입니다. 값은 insert 시 0x00으로 오른쪽이 채워지며, retrieval 시에는 끝에 오는 바이트가 제거되지 않습니다. ORDER BY 및 DISTINCT 연산을 포함하여 모든 비교에서 모든 바이트가 중요합니다. 비교에서 0x00과 공백은 서로 다르며, 0x00은 공백보다 앞에 정렬됩니다.
예: BINARY(3) 컬럼의 경우, 'a '는 insert 시 'a \0'가 됩니다. 'a\0'는 insert 시 'a\0\0'가 됩니다. 이 두 값은 retrieval 시에도 변경되지 않은 상태로 유지됩니다.
VARBINARY의 경우, insert 시 패딩이 없고 retrieval 시 바이트가 제거되지 않습니다. ORDER BY 및 DISTINCT 연산을 포함하여 모든 비교에서 모든 바이트가 중요합니다. 비교에서 0x00과 공백은 서로 다르며, 0x00은 공백보다 앞에 정렬됩니다.
뒤쪽 패딩 바이트가 제거되거나 비교에서 무시되는 경우에는, 컬럼에 유니크 값을 요구하는 인덱스가 있으면 뒤쪽 패딩 바이트 수만 다른 값을 컬럼에 insert하면 중복 키 에러가 발생합니다. 예를 들어, 테이블에 'a'가 포함되어 있을 때, 'a\0'을 저장하려는 시도는 중복 키 에러를 발생시킵니다.
BINARY 데이터 타입을 사용하여 바이너리 데이터를 저장하고, retrieval된 값이 저장된 값과 정확히 동일하기를 요구하는 경우에는 위에서 언급한 패딩 및 제거 특성을 신중히 고려해야 합니다. 다음 예제는 BINARY 값의 0x00 패딩이 컬럼 값 비교에 어떤 영향을 미치는지를 설명합니다:
1mysql> CREATE TABLE t (c BINARY(3)); 2Query OK, 0 rows affected (0.01 sec) 3 4mysql> INSERT INTO t SET c = 'a'; 5Query OK, 1 row affected (0.01 sec) 6 7mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t; 8+--------+---------+-------------+ 9| HEX(c) | c = 'a' | c = 'a\0\0' | 10+--------+---------+-------------+ 11| 610000 | 0 | 1 | 12+--------+---------+-------------+ 131 row in set (0.09 sec)
저장 시 지정한 값과 동일한 값이 패딩 없이 retrieval되어야 한다면, VARBINARY 또는 BLOB 데이터 타입 중 하나를 사용하는 것이 더 나을 수 있습니다.
참고
mysql 클라이언트 내에서 바이너리 문자열은 --binary-as-hex의 값에 따라 16진 표기법을 사용하여 표시됩니다. 해당 옵션에 대한 자세한 정보는 Section 6.5.1, “mysql — The MySQL Command-Line Client”을 참조하십시오.
13.3.2 The CHAR and VARCHAR Types
13.3.4 The BLOB and TEXT Types