11.4.5 SET 형
SET
는 0 개 이상의 값을 취할 수있는 문자열 개체이며, 각각의 값은 테이블을 만들 때 지정된 허용되는 값 목록에서 선택해야합니다. SET
컬럼 값이 여러 세트 멤버로 구성된 경우 각 구성원은 쉼표 ( " ,
")로 구분됩니다. 따라서 SET
멤버의 값 자체에 쉼표를 포함하지 마십시오.
예를 들어, SET('one', 'two') NOT NULL
로 지정된 컬럼은 다음 값 중 하나를 취합니다.
'' 'one' 'two' 'one, two'
SET
컬럼은 최대 64 개의 개별 구성원을 포함 할 수 있습니다. 테이블에는 그룹으로 간주되는 ENUM
및 SET
컬럼 안의 고유 요소 목록 정의를 255 개 이하를 포함 할 수 있습니다. 이 제한 자세한 내용은 섹션 D.10.5 ".frm 파일 구조에 의해 부과되는 제한" 을 참조하십시오.
정의에 중복 된 값이 포함되어 있으면 경고 (엄격한 SQL 모드가 활성화되어 있으면 오류)가 발생합니다.
테이블이 작성 될 때 테이블 정의에서 SET
멤버 값에서 후행 공백이 자동으로 삭제됩니다.
SET
컬럼에 저장된 값은 취득 할 때, 컬럼 정의에서 사용 된 대 / 소문자로 표시됩니다. SET
컬럼에는 문자 셋과 콜레 션을 할당 할 수 있습니다. 이진 데이터 정렬 또는 대소 문자 구분 데이터 정렬의 경우, 컬럼에 값을 할당 할 때 대 / 소문자가 고려됩니다.
MySQL은 첫 세트 멤버에 해당하는 저장 값의 하위 비트를 사용하여 SET
값을 숫자로 저장합니다. SET
값을 숫자 컨텍스트에서 취득한 경우 그 취득 된 값은 컬럼 값을 구성하는 세트 멤버에 해당하는 비트 세트가 포함되어 있습니다. 예를 들어, 다음과 같이 SET
컬럼에서 숫자를 얻을 수 있습니다.
mysql> SELECT set_col
+0 FROM tbl_name
;
멤버가 SET
컬럼에 저장되면 그 숫자의 이진 표현에 설정되어있는 비트에서 컬럼 값의 세트 멤버가 특정됩니다. 컬럼이 SET('a','b','c','d')
로 지정되어있는 경우, 세트 멤버는 다음 10 진수와 2 진수 값을가집니다.
SET Member | Decimal Value | Binary Value |
---|---|---|
'a' | 1 | 0001 |
'b' | 2 | 0010 |
'c' | 4 | 0100 |
'd' | 8 | 1000 |
이 컬럼에 9
의 값을 할당하면 2 진수 1001
하므로 SET
값의 첫 번째와 네 번째 멤버 인 'a'
와 'd'
가 선택되고 결과 값은 'a,d'
입니다.
하나 이상의 SET
요소를 포함한 값은 값을 삽입 할 때 요소가 어떤 순서로 나열되어 있는지는 중요하지 않습니다. 또한 소정의 요소 값에서 여러 번 나열되어 있는지도 중요하지 않습니다. 나중에 값을 얻을 때 값의 각 요소는 테이블 생성시에 지정된 순서에 따라 한 번 표시됩니다. 예를 들어, 컬럼이 SET('a','b','c','d')
로 지정되어 있다고합니다.
mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
'a,d'
, 'd,a'
, 'a,d,d'
, 'a,d,a'
및 'd,a,d'
의 값을 삽입 한 경우
mysql> INSERT INTO myset (col) VALUES
-> ( 'a, d') ( 'd, a') ( 'a, d, a') ( 'a, d, d') ( 'd, a, d');
Query OK, 5 rows affected (0.01 sec)
Records : 5 Duplicates : 0 Warnings : 0
이러한 값은 모두 취득 할 때 'a,d'
로 표시됩니다.
mysql> SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
5 rows in set (0.04 sec)
지원되지 않는 값으로 SET
컬럼을 설정하면 그 값은 무시되고 경고가 표시됩니다.
mysql>INSERT INTO myset (col) VALUES ('a,d,d,s');
Query OK, 1 row affected, 1 warning (0.03 sec) mysql>SHOW WARNINGS;
+---------+------+------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------+ | Warning | 1265 | Data truncated for column 'col' at row 1 | +---------+------+------------------------------------------+ 1 row in set (0.04 sec) mysql>SELECT col FROM myset;
+------+ | col | +------+ | a,d | | a,d | | a,d | | a,d | | a,d | | a,d | +------+ 6 rows in set (0.01 sec)
엄격한 SQL 모드가 활성화되면 잘못된 SET
값을 삽입하려고하면 오류가 발생합니다.
SET
값은 수치로 정렬됩니다. NULL
값은 비 NULL
SET
값 앞에 정렬됩니다.
수치 인수를 SUM()
과 AVG()
등의 함수는 필요에 따라 인수를 숫자로 변환합니다. SET
값의 경우 캐스팅 작업에 따라서 수치가 사용됩니다.
일반적으로 FIND_IN_SET()
함수 또는 LIKE
연산자를 사용하여 SET
값을 검색합니다.
mysql>SELECT * FROM
mysql>tbl_name
WHERE FIND_IN_SET('value
',set_col
)>0;SELECT * FROM
tbl_name
WHEREset_col
LIKE '%value
%';
첫 번째 문은 set_col
이 value
세트 구성원을 포함하는 행을 찾습니다. 두 번째도 비슷하지만 같지는 않습니다. 다른 세트 멤버의 부분 문자열로하더라도, set_col
이 value
를 포함하는 행을 찾습니다.
다음 문을 사용할 수 있습니다.
mysql>SELECT * FROM
mysql>tbl_name
WHEREset_col
& 1;SELECT * FROM
tbl_name
WHEREset_col
= 'val1
,val2
';
이들 중 첫 번째 문은 첫 세트 멤버를 포함한 값을 찾습니다. 두 번째 문은 정확히 일치하는 값을 찾습니다. 두 번째 형태는 신중하게 비교하십시오. 세트 값을 '
과 비교하면 값을 val1
, val2
''
와 비교했을 때와는 다른 결과가 반환됩니다. 컬럼 정의에 나열된 순서대로 값을 지정해야합니다. val2
, val1
'
SET
컬럼의 가능한 값을 모두 확인하려면 SHOW COLUMNS FROM
를 사용하여 출력 tbl_name
LIKE set_col
Type
컬럼의 SET
정의를 구문 분석합니다.
C API에서는 SET
값은 문자열로 반환됩니다. 결과 세트의 메타 데이터를 사용하여 이들을 다른 문자열에서 구분하는 방법은 섹션 23.8.5 "C API 데이터 구조" 를 참조하십시오.