13

この質問に続いて、「データベースの列挙 - 長所と短所」、どのデータベース システムが列挙型データ型をサポートしているか、およびそれらがどのようにそれを行うかについて少し詳しく知りたいです (たとえば、内部に格納されているもの、制限は何か、クエリ構文の影響、インデックス作成の影響など)。

ユースケースまたは長所と短所についての議論は、他の質問で行う必要があります。

4

6 に答える 6

7

MySQLがENUMをサポートしていることを知っています。

  • データ型は、関連する文字列を持つ整数値として実装されます
  • 1つの列挙に対して最大65.535個の要素を持つことができます
  • 各文字列には、定義順に1から数えて同等の数値があります。
  • フィールドの数値には、「SELECT enum_col+0」からアクセスできます。
  • 非厳密SQLモードでは、リストにない値を割り当てると必ずしもエラーが発生するわけではなく、代わりに数値0の特別なエラー値が割り当てられます。
  • 並べ替えは、同等の文字列のアルファベット順ではなく、番号順(定義順など)で行われます。
  • 割り当ては、値の文字列またはインデックス番号を介して機能します
  • これ:整数値ENUM('0','1','2')になるため、避ける必要があります'0'1
于 2008-12-03T13:37:14.083 に答える
7

PostgreSQLは8.3以降のENUMをサポートしています。古いバージョンの場合は、次を使用できます。

次のような操作を行うことで、ENUMをシミュレートできます。

CREATE TABLE persons (
  person_id int not null primary key,
  favourite_colour varchar(255) NOT NULL,
  CHECK (favourite_colour IN ('red', 'blue', 'yellow', 'purple'))
);

あなたも持つことができます:

CREATE TABLE colours (
  colour_id int not null primary key,
  colour varchar(255) not null
)
CREATE TABLE persons (
  person_id int not null primary key,
  favourite_colour_id integer NOT NULL references colours(colour_id),
);

これにより、お気に入りの色を知ったときに結合を追加できますが、カラーテーブルにエントリを追加するだけで色を追加できるという利点があり、毎回スキーマを変更する必要がないという利点があります。HTMLコードやRVB値などの属性を色に追加することもできます。

列挙型を実行する独自の型を作成することもできますが、varcharや。よりも高速になるとは思いませんCHECK

于 2008-12-03T13:44:24.973 に答える
4

OracleはENUMをまったくサポートしていません。

于 2008-12-03T12:58:55.517 に答える
4

私の知る限り、IBM DB2もIBM Informix Dynamic ServerもENUM型をサポートしていません。

于 2008-12-16T03:57:32.733 に答える
2

マットが言ったこととは異なり、PostgreSQLはENUMをサポートしています(バージョン8.3以降、最後のもの):

essais=> CREATE TYPE rcount AS ENUM (
essais(>   'one',
essais(>   'two',
essais(>   'three'
essais(> );
CREATE TYPE
essais=> 
essais=> CREATE TABLE dummy (id SERIAL, num rcount);
NOTICE:  CREATE TABLE will create implicit sequence "dummy_id_seq" for serial column "dummy.id"
CREATE TABLE
essais=> INSERT INTO dummy (num) VALUES ('one');
INSERT 0 1
essais=> INSERT INTO dummy (num) VALUES ('three');
INSERT 0 1
essais=> INSERT INTO dummy (num) VALUES ('four');
ERROR:  invalid input value for enum rcount: "four"
essais=> 
essais=> SELECT * FROM dummy WHERE num='three';
 id |  num  
----+-------
  2 | three
  4 | three

特に列挙型で機能する関数があります。

インデックス付けは列挙型で正常に機能します。

マニュアルによると、実装は次のとおりです。

列挙値はディスク上で4バイトを占めます。列挙値のテキストラベルの長さは、PostgreSQLにコンパイルされたNAMEDATALEN設定によって制限されます。標準ビルドでは、これは最大63バイトを意味します。

列挙型ラベルでは大文字と小文字が区別されるため、「happy」は「HAPPY」と同じではありません。ラベルのスペースも重要です。

于 2008-12-08T13:26:06.113 に答える
1

MSSQLはENUMをサポートしていません。

Entity Framework 5を使用する場合は、列挙型を使用できます(Entity Frameworkの列挙型サポートおよびEF5列挙型ウォークスルーを参照)が、それでも値はデータベースにintとして格納されます。

于 2012-07-10T10:51:18.523 に答える