MySQL列挙型とセット


92

「enum」と「set」のMySQLデータ型の場合、一方を使用することと他方を使用することの違いと長所と短所は何ですか?

データ型の例:

  • enum( 'A'、 'B'、 'C​​')
  • set( 'A'、 'B'、 'C​​')

私が知っている唯一の違いは、ENUMでは1つの値しか選択できないのに対し、SETでは複数の値を選択できるということです。


5
前進/不利はありません。要件に応じて、そのうちの1つを選択する必要があります。
ravnur 2013

1
2つのタイプは無関係です。intとtextのどちらが良いかを尋ねた方がいいでしょう。
ボヘミアン

回答:


68

MySQLのドキュメントの状態:

ENUMまたはSET列の定義は、列に入力された値に対する制約として機能します。次の条件を満たさない値ではエラーが発生します。

ENUM値は、列定義にリストされている値の1つ、またはそれに相当する内部数値でなければなりません。値をエラー値(つまり、0または空の文字列)にすることはできません。ENUM( 'a'、 'b'、 'c')として定義された列の場合、 ''、 'd'、または 'ax'などの値は無効であり、拒否されます。

SET値は、空の文字列、または列定義にコンマで区切られた値のみで構成される値である必要があります。SET( 'a'、 'b'、 'c')として定義された列の場合、 'd'や 'a、b、c、d'などの値は無効であり、拒否されます。


22
注意!の値は(a, b, c, d)拒否されません。だけdが拒否されるため、値はになります(a, b, c)
Itay Grudev 2014

3
これは公式のドキュメントかもしれませんが、それでもそれらを説明する非常に紛らわしい方法です。他の回答に基づいて、違いが明らかになります。SETはENUMの配列であり、各値は0個以上の列挙型スタイル値で構成されます。
Jonathon 2015

10
これは良い答えではありません。違いとデメリット/デメリットの明確な説明が求められました。この回答が単なるコピーである公式文書は、そうすることに失敗しています。
Smuuf 2016年

(a、b、c、d)は、厳密モードがオンの場合は拒否されます
Chinmay 2016

2
これは答えではありません。
アミットシャー

204

類推:
ENUM =無線フィールド(受け入れられた値のみがリストされたものであり、1つのみを選択できます)
SET =チェックボックスフィールド(受け入れられた値のみがリストされたものであり、複数を選択できます)


5
清潔でわかりやすい!
アブショエブ

これは明確に説明されている正しい違いです。@Bradケントありがとう
ラヴィ・テジャ

44

列挙型と設定は完全に要件に依存します。たとえば、一度に1つしか選択できないラジオボタンのリストがある場合は、列挙型を使用します。また、一度に複数の項目を選択できるチェックボックスのリストがある場合は、setを使用します。


22
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回に1回しか保存できないことがわかります。そして、最後の2行の結果は両方とも空になることがわかります。


9

実際、それは非常に簡単です。

ENUM( 'Yes'、 'No'、 'Maybe')を定義するときは、これらの値の1つ(またはそれらの位置インデックス番号)のみを挿入する必要あります。

あなたが定義する際SET(「R」、「W」、「X」)を、あなたがすることができ、空の文字列、INSERTまたはこれらの値を1つ以上。事前定義されたセットにないものを挿入すると、代わりに空の文字列が挿入されます。挿入する前に、重複する値はすべて破棄されるため、許可された各値のインスタンスが1つだけ挿入されることに注意してください。

これがそれをクリアすることを願っています。

Winbobobの回答は正しくなく、欠陥のある例が含まれていることに注意してください。複数の値を挿入する場合、値はコンマで区切られた文字列である必要があります。彼のすべての挿入は、実際には1つの値のみを挿入しています(最後の2つは定義されたセットに含まれていません)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.