「列挙型」と「セット」のMySQLデータ型の場合、一方を使用することと他方を使用することの違いと長所と短所は何ですか?
データ型の例:
- enum('A'、'B'、'C')
- set('A'、'B'、'C')
私が知っている唯一の違いは、ENUMでは1つの値しか選択できないのに対し、SETでは複数の値を選択できるということです。
類推:
ENUM =無線フィールド(受け入れられた値のみがリストされたものであり、1つのみを選択できます)
SET =チェックボックスフィールド(受け入れられた値のみがリストされたものであり、複数を選択できます)
MySQLのドキュメントに記載されているように:
ENUMまたはSET列の定義は、列に入力された値に対する制約として機能します。次の条件を満たさない値でエラーが発生します。
ENUM値は、列定義にリストされている値の1つ、またはそれに相当する内部数値でなければなりません。値をエラー値(つまり、0または空の文字列)にすることはできません。ENUM('a'、'b'、'c')として定義された列の場合、''、'd'、または'ax'などの値は無効であり、拒否されます。
SET値は、空の文字列、または列定義にコンマで区切られた値のみで構成される値である必要があります。SET('a'、'b'、'c')として定義された列の場合、'd'や'a、b、c、d'などの値は不正であり、拒否されます。
列挙型と設定型は要件に完全に依存します。たとえば、一度に1つしか選択できないラジオボタンのリストがある場合は、列挙型を使用します。また、一度に複数の項目を選択できるチェックボックスのリストがある場合は、setを使用します。
CREATE TABLE setTest(
attrib SET('bold','italic','underline')
);
INSERT INTO setTest (attrib) VALUES ('bold');
INSERT INTO setTest (attrib) VALUES ('bold,italic');
INSERT INTO setTest (attrib) VALUES ('bold,italic,underline');
上記のコードをコピーしてmysqlに貼り付けると、 SETが実際にはコレクションであることがわかります。宣言した属性の各組み合わせを保存できます。
CREATE TABLE enumTest(
color ENUM('red','green','blue')
);
INSERT INTO enumTest (color) VALUES ('red');
INSERT INTO enumTest (color) VALUES ('gray');
INSERT INTO enumTest (color) VALUES ('red,green');
上記のコードをコピーすることもできます。また、各ENUMは実際には毎回1回しか保存できないことがわかります。そして、最後の2行の結果は両方とも空になります。
実際、それは非常に簡単です。
ENUM('Yes'、'No'、'Maybe')を定義するときは、これらの値の1つ(またはそれらの位置インデックス番号)のみを挿入する必要があります。
SET('R'、'W'、'X')を定義すると、空の文字列、またはこれらの値の1つ以上を挿入できます。事前定義されたセットにないものを挿入すると、代わりに空の文字列が挿入されます。挿入する前に、重複する値はすべて破棄されるため、許可された各値のインスタンスが1つだけ挿入されることに注意してください。
これがそれをクリアすることを願っています。
Winbobobの回答は正しくなく、欠陥のある例が含まれていることに注意してください。複数の値を挿入する場合、値はコンマで区切られた文字列である必要があります。彼のすべての挿入は、実際には1つの値だけを挿入しています(最後の2つは定義されたセットに含まれていません)
ENUM->挿入する使用可能な値の1つのみを選択します。
(no_null、no_any_duplicate)
SET->セットのような任意の組み合わせまたは単一の値を選択し、それらをに挿入します。
(null、individual_values、all_the_available_values_together)
これまでの回答ですでに述べたポイントに加えて、違いについてさらにポイントを追加しています-
MySQLは、列挙にn個のメンバーがある列の場合、ENUM文字列値を値1からnの10進整数として内部的に格納します。
MySQLは、SET文字列値を値ごとに1ビットを使用するビットビットとして表します。したがって、値は1、2、4、8、.....最大65,535、最大64メンバーとして内部に格納されます。
この点は以下のように示されます-
ENUMの例-
次のテーブル構造のデータ型のtable1
列を持つテーブルを作成します-col1
ENUM('a','b','c','d','e','f','g','h','i','j')
| table1 | CREATE TABLE `table1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`col1` enum('a','b','c','d','e','f','g','h','i','j') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
col1
次のように内部的に保存されます-
+----+---------+---------------+
| id | element | decimal_value |
+----+---------+---------------+
| 1 | a | 1 |
| 2 | b | 2 |
| 3 | c | 3 |
| 4 | d | 4 |
| 5 | e | 5 |
| 6 | f | 6 |
| 7 | g | 7 |
| 8 | h | 8 |
| 9 | i | 9 |
| 10 | j | 10 |
+----+---------+---------------+
ここで、値を挿入したいとします-'e'
にcol1
'e'
インデックスがあります5
したがって、入力'e'
するcol1
には、次のクエリを使用します-
INSERT INTO table1 VALUES (1, 5);
次に、table1
-に存在する値を確認します
SELECT * FROM table1;
+----+------+
| id | col1 |
+----+------+
| 1 | e |
+----+------+
col1
最初の行に次の値があることがわかります'e'
繰り返しますが、値を挿入したいとします-'i'
にcol1
'i'
インデックスがあります9
したがって、入力'i'
するcol1
には、次のクエリを使用します-
INSERT INTO table1 VALUES (2, 9);
次に、table1
-に存在する値を確認します
SELECT * FROM table1;
+----+------+
| id | col1 |
+----+------+
| 1 | e |
| 2 | i |
+----+------+
2行目には、次の値がありますcol1
。'i'
繰り返しますが、値を挿入したいとします-'a'
にcol1
'a'
インデックスがあります1
したがって、入力'a'
するcol1
には、次のクエリを使用します-
INSERT INTO table1 VALUES (3, 1);
次に、table1
-に存在する値を確認します
SELECT * FROM table1;
+----+------+
| id | col1 |
+----+------+
| 1 | e |
| 2 | i |
| 3 | a |
+----+------+
3行目には、次の値がありますcol1
。'a'
SETの例-
次のテーブル構造のデータ型のtable1
列を持つテーブルを作成します-col1
SET('a','b','c','d','e','f','g','h','i','j')
| table1 | CREATE TABLE `table1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`col1` set('a','b','c','d','e','f','g','h','i','j') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
col1
次のように内部的に保存されます-
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 1 | a | 0000 0000 0001 | 1 |
| 2 | b | 0000 0000 0010 | 2 |
| 3 | c | 0000 0000 0100 | 4 |
| 4 | d | 0000 0000 1000 | 8 |
| 5 | e | 0000 0001 0000 | 16 |
| 6 | f | 0000 0010 0000 | 32 |
| 7 | g | 0000 0100 0000 | 64 |
| 8 | h | 0000 1000 0000 | 128 |
| 9 | i | 0001 0000 0000 | 256 |
| 10 | j | 0010 0000 0000 | 512 |
+----+---------+----------------+---------------+
ここで、値を挿入したいとします-'e,f,i'
にcol1
次に、のbinary_valueは、のbinary_valuesを加算する'e,f,i'
ことによって計算されます。これは、対応するdecimal_valueは次のようになります-'e'
'f'
'i'
0001 0011 0000
304
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 5 | e | 0000 0001 0000 | 16 |
| 6 | f | 0000 0010 0000 | 32 |
| 9 | i | 0001 0000 0000 | 256 |
+----+---------+----------------+---------------+
| | e,f,i | 0001 0011 0000 | 304 |
+----+---------+----------------+---------------+
したがって、入力'e,f,i'
するcol1
には、次のクエリを使用します-
INSERT INTO table1 VALUES (1, 304);
次に、table1
-に存在する値を確認します
SELECT * FROM table1;
+----+-------+
| id | col1 |
+----+-------+
| 1 | e,f,i |
+----+-------+
col1
最初の行に次の値があることがわかります'e,f,i'
繰り返しますが、値を挿入したいとします-'a,j'
にcol1
次に、のbinary_valueは、のbinary_valuesを加算'a,j'
することによって計算され、対応するdecimal_valueは次のようになります-'a'
'j'
0010 0000 0001
513
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 1 | a | 0000 0000 0001 | 1 |
| 10 | j | 0010 0000 0000 | 512 |
+----+---------+----------------+---------------+
| | a,j | 0010 0000 0001 | 513 |
+----+---------+----------------+---------------+
したがって、入力'a,j'
するcol1
には、次のクエリを使用します-
INSERT INTO table1 VALUES (2, 513);
次に、table1
-に存在する値を確認します
SELECT * FROM table1;
+----+-------+
| id | col1 |
+----+-------+
| 1 | e,f,i |
| 2 | a,j |
+----+-------+
2行目には、次の値がありますcol1
。'a,j'
繰り返しますが、値を挿入したいとします-'b,d,h,i'
にcol1
次に、のbinary_valueは、、、のbinary_valuesを加算すること'b,d,h,i'
によって計算されます。これは、対応するdecimal_valueは次のようになります-'b'
'd'
'h'
'i'
0001 1000 1010
394
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 2 | b | 0000 0000 0010 | 2 |
| 4 | d | 0000 0000 1000 | 8 |
| 8 | h | 0000 1000 0000 | 128 |
| 9 | i | 0001 0000 0000 | 256 |
+----+---------+----------------+---------------+
| | b,d,h,i | 0001 1000 1010 | 394 |
+----+---------+----------------+---------------+
したがって、入力'b,d,h,i'
するcol1
には、次のクエリを使用します-
INSERT INTO table1 VALUES (3, 394);
次に、table1
-に存在する値を確認します
SELECT * FROM table1;
+----+---------+
| id | col1 |
+----+---------+
| 1 | e,f,i |
| 2 | a,j |
| 3 | b,d,h,i |
+----+---------+
3行目には、次の値がありますcol1
。'b,d,h,i'