跟进这个问题:“Database enums - pros and cons”,我想知道哪个数据库系统的支持枚举数据类型,以及他们是如何做到这一点的细节(例如,什么是内部存储,有什么限制,查询语法意义,索引影响......)。哪些数据库系统支持ENUM数据类型,哪些不支持?
的使用情况或利弊讨论应在其他问题。
跟进这个问题:“Database enums - pros and cons”,我想知道哪个数据库系统的支持枚举数据类型,以及他们是如何做到这一点的细节(例如,什么是内部存储,有什么限制,查询语法意义,索引影响......)。哪些数据库系统支持ENUM数据类型,哪些不支持?
的使用情况或利弊讨论应在其他问题。
Oracle根本不支持ENUM。
我知道,MySQL的不支持ENUM:
SELECT enum_col+0
”ENUM('0','1','2')
应避免,因为'0'
将具有整数值1
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
更快。
不像什么垫表示,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
有功能,这work specifically on enums。
索引适用于枚举类型的罚款。
根据手册,实施如下:
的枚举值占据在磁盘上的四个字节。枚举值的文本标签的长度受编译为PostgreSQL的NAMEDATALEN设置的限制;在标准构建中,这意味着最多63个字节。
枚举标签区分大小写,所以'happy'和'HAPPY'不一样。标签中的空间也很重要。
AFAIK既不是IBM DB2也不是IBM Informix Dynamic Server支持ENUM类型。
MSSQL不支持ENUM。
当您使用实体框架5时,可以使用枚举(请参阅:Enumeration Support in Entity Framework和EF5 Enum Types Walkthrough),但即使这样,值也会以int形式存储在数据库中。
PostgreSQL从版本8.3开始支持ENUM(请参阅我的答案)。 – bortzmeyer 2008-12-09 13:29:49
谢谢,编辑我的答案反映。 – mat 2008-12-09 14:42:17