Loading...
MySQL 9.5 Reference Manual 9.5의 13.3.7 The SET Type의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
SET은 문자열 오브젝트로, 0개 이상의 값을 가질 수 있으며, 각 값은 테이블이 생성될 때 지정한 허용 값 목록에서 선택되어야 합니다.
여러 set 멤버로 구성된 SET 컬럼 값은 멤버를 콤마(,)로 구분하여 지정합니다.
이로 인해 SET 멤버 값 자체에는 콤마를 포함하지 않아야 합니다.
예를 들어, SET('one', 'two') NOT NULL로 지정된 컬럼은 다음 값들 중 아무 것이나 가질 수 있습니다:
1'' 2'one' 3'two' 4'one,two'
SET 컬럼은 최대 64개의 상이한 멤버를 가질 수 있습니다.
정의에 중복 값이 있으면 경고가 발생하며, strict SQL 모드가 활성화되어 있는 경우에는 에러가 발생합니다.
테이블이 생성될 때, 테이블 정의의 SET 멤버 값에 포함된 끝 공백(trailing space)은 자동으로 삭제됩니다.
SET 타입의 저장 공간 요구 사항에 대해서는
String Type Storage Requirements를 참조하십시오.
SET 타입 문법과 길이 제한에 대해서는
Section 13.3.1, “String Data Type Syntax”를 참조하십시오.
SET 컬럼에 저장된 값이 조회될 때는 컬럼 정의에 사용된 대소문자를 사용하여 표시됩니다.
SET 컬럼에는 문자 집합과 콜레이션을 지정할 수 있다는 점에 유의하십시오.
바이너리 또는 대소문자 구분 콜레이션의 경우, 컬럼에 값을 할당할 때 대소문자가 고려됩니다.
MySQL은 SET 값을 숫자 형태로 저장하며, 저장된 값의 최하위 비트는 첫 번째 set 멤버에 해당합니다.
SET 값을 숫자 컨텍스트에서 조회하면, 조회된 값은 컬럼 값을 구성하는 set 멤버에 해당하는 비트가 설정된 값이 됩니다.
예를 들어, SET 컬럼으로부터 숫자 값을 다음과 같이 조회할 수 있습니다:
1mysql> SELECT set_col+0 FROM tbl_name;
숫자를 SET 컬럼에 저장하면, 그 숫자의 바이너리 표현에서 설정된 비트가 컬럼 값의 set 멤버를 결정합니다.
SET('a','b','c','d')로 지정된 컬럼의 경우, 멤버는 다음과 같은 십진수 및 이진수 값을 가집니다.
SET Member | Decimal Value | Binary Value |
|---|---|---|
'a' | 1 | 0001 |
'b' | 2 | 0010 |
'c' | 4 | 0100 |
'd' | 8 | 1000 |
이 컬럼에 9 값을 할당하면, 이는 이진수로 1001이므로 첫 번째와 네 번째 SET value 멤버인 'a'와 'd'가 선택되며, 결과 값은 'a,d'가 됩니다.
하나 이상의 SET element를 포함하는 값에 대해서는, 값을 insert할 때 element들이 어떤 순서로 나열되어 있는지는 중요하지 않습니다.
또한 주어진 element가 값 안에서 몇 번 나열되어 있는지도 중요하지 않습니다.
값이 나중에 조회될 때는, 각 element는 한 번씩만 나타나며, element들은 테이블 생성 시 지정된 순서에 따라 나열됩니다.
예를 들어, 컬럼이 SET('a','b','c','d')로 지정되어 있다고 가정해 봅시다:
1mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
값 'a,d', 'd,a', 'a,d,d', 'a,d,a', 'd,a,d'를 insert하면:
1mysql> INSERT INTO myset (col) VALUES 2-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); 3Query OK, 5 rows affected (0.01 sec) 4Records: 5 Duplicates: 0 Warnings: 0
이 값들은 모두 조회 시 'a,d'로 표시됩니다:
1mysql> SELECT col FROM myset; 2+------+ 3| col | 4+------+ 5| a,d | 6| a,d | 7| a,d | 8| a,d | 9| a,d | 10+------+ 115 rows in set (0.04 sec)
SET 컬럼에 지원되지 않는 값을 설정하면, 그 값은 무시되고 경고가 발생합니다:
1mysql> INSERT INTO myset (col) VALUES ('a,d,d,s'); 2Query OK, 1 row affected, 1 warning (0.03 sec) 3 4mysql> SHOW WARNINGS; 5+---------+------+------------------------------------------+ 6| Level | Code | Message | 7+---------+------+------------------------------------------+ 8| Warning | 1265 | Data truncated for column 'col' at row 1 | 9+---------+------+------------------------------------------+ 101 row in set (0.04 sec) 11 12mysql> SELECT col FROM myset; 13+------+ 14| col | 15+------+ 16| a,d | 17| a,d | 18| a,d | 19| a,d | 20| a,d | 21| a,d | 22+------+ 236 rows in set (0.01 sec)
strict SQL 모드가 활성화된 경우, 유효하지 않은 SET 값을 insert하려고 시도하면 에러가 발생합니다.
SET 값은 숫자 기준으로 정렬됩니다.
NULL 값은 non-NULL SET 값보다 앞에 정렬됩니다.
SUM() 또는
AVG()처럼 숫자 인자를 기대하는 함수는 필요한 경우 인자를 숫자로 캐스트합니다.
SET 값에 대해서는 캐스트 연산으로 인해 숫자 값이 사용됩니다.
일반적으로, SET 값을 검색할 때는
FIND_IN_SET() 함수나
LIKE 연산자를 사용합니다:
1mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0; 2mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
첫 번째 문장은 set_col에 value set 멤버가 포함된 row를 찾습니다.
두 번째 문장도 비슷하지만 동일하지는 않습니다.
이는 set_col에 value가, 다른 set 멤버의 부분 문자열로라도, 어디에든 포함된 row를 찾습니다.
다음 문장들도 허용됩니다:
1mysql> SELECT * FROM tbl_name WHERE set_col & 1; 2mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
첫 번째 문장은 첫 번째 set 멤버를 포함하는 값을 찾습니다. 두 번째 문장은 정확히 일치하는 값을 찾습니다.
두 번째 유형의 비교를 사용할 때는 주의해야 합니다.
set 값을 'val1,val2'와 비교하는 것은 'val2,val1'과 비교하는 것과 다른 결과를 반환합니다.
컬럼 정의에 나열된 것과 동일한 순서로 값을 지정해야 합니다.
SET 컬럼의 가능한 모든 값을 확인하려면,
SHOW COLUMNS FROM tbl_name LIKE set_col을 사용하고, 출력의 Type 컬럼에 있는 SET 정의를 파싱하십시오.
C API에서는 SET 값이 문자열로 반환됩니다.
이들을 다른 문자열과 구분하기 위해 결과 집합 메타데이터를 사용하는 방법에 대해서는
C API Basic Data Structures를 참조하십시오.
13.3.6 The ENUM Type
13.4 Spatial Data Types