哪些数据库系统支持ENUM数据类型,哪些不支持?

时间:2008-12-03 12:51:36

标签: database enums types rdbms

跟进这个问题:“Database enums - pros and cons”,我想知道哪些数据库系统支持枚举数据类型,以及它们如何做的一些细节(例如内部存储的内容,什么是限制,查询语法含义,索引含义,......)。

应在其他问题中讨论用例或利弊。

6 个答案:

答案 0 :(得分:7)

我知道MySQL确实支持ENUM:

  • 数据类型实现为带有关联字符串的整数值
  • 单个枚举最多可包含65.535个元素
  • 每个字符串都有一个数字等价物,按照定义的顺序从1开始计算
  • 可通过“SELECT enum_col+0
  • 访问该字段的数值
  • 在非严格的SQL模式下,分配not-in-list值不一定会导致错误,而是分配一个特殊的错误值,具有数值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

work specifically on enums

的功能

索引在枚举类型上运行正常。

根据手册,实施如下:

  

枚举值占用磁盘上的四个字节。枚举值的文本标签的长度受编译到PostgreSQL中的NAMEDATALEN设置的限制;在标准版本中,这意味着最多63个字节。

     

枚举标签区分大小写,因此'happy'与'HAPPY'不同。标签中的空格也很重要。

答案 5 :(得分:1)

MSSQL不支持ENUM。

当您使用Entity Framework 5时,您可以使用枚举(查看:Enumeration Support in Entity Framework EF5 Enum Types Walkthrough),但即使这样,值也会以int形式存储在数据库中。