跟进这个问题:“Database enums - pros and cons”,我想知道哪些数据库系统支持枚举数据类型,以及它们如何做的一些细节(例如内部存储的内容,什么是限制,查询语法含义,索引含义,......)。
应在其他问题中讨论用例或利弊。
答案 0 :(得分:7)
我知道MySQL确实支持ENUM:
SELECT enum_col+0
”ENUM('0','1','2')
应该避免,因为'0'
会有整数值1
答案 1 :(得分: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
更快。
答案 2 :(得分:4)
Oracle根本不支持ENUM。
答案 3 :(得分:4)
AFAIK,IBM DB2和IBM Informix Dynamic Server都不支持ENUM类型。
答案 4 :(得分:2)
与mat所说的不同,PostgreSQL does support 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
的功能
索引在枚举类型上运行正常。
根据手册,实施如下:
枚举值占用磁盘上的四个字节。枚举值的文本标签的长度受编译到PostgreSQL中的NAMEDATALEN设置的限制;在标准版本中,这意味着最多63个字节。
枚举标签区分大小写,因此'happy'与'HAPPY'不同。标签中的空格也很重要。
答案 5 :(得分:1)
MSSQL不支持ENUM。
当您使用Entity Framework 5时,您可以使用枚举(查看:Enumeration Support in Entity Framework 和EF5 Enum Types Walkthrough),但即使这样,值也会以int形式存储在数据库中。