Database 哪些数据库系统支持枚举数据类型,哪些不支持?

Database 哪些数据库系统支持枚举数据类型,哪些不支持?,database,enums,types,rdbms,Database,Enums,Types,Rdbms,接下来是这个问题:,我想知道哪些数据库系统支持枚举数据类型,以及它们是如何实现的,例如内部存储的内容、限制、查询语法含义、索引含义等等 其他问题中应讨论用例或优缺点。Oracle根本不支持ENUM。我知道MySQL确实支持ENUM: 数据类型实现为带有关联字符串的整数值 单个枚举最多可包含65.535个元素 每个字符串都有一个从1开始按定义顺序计数的等效数字 该字段的数值可通过选择enum_col+0访问 在非严格SQL模式下,分配not in list值不一定会导致错误,而是分配一个特殊的错误

接下来是这个问题:,我想知道哪些数据库系统支持枚举数据类型,以及它们是如何实现的,例如内部存储的内容、限制、查询语法含义、索引含义等等


其他问题中应讨论用例或优缺点。

Oracle根本不支持ENUM。

我知道MySQL确实支持ENUM:

数据类型实现为带有关联字符串的整数值 单个枚举最多可包含65.535个元素 每个字符串都有一个从1开始按定义顺序计数的等效数字 该字段的数值可通过选择enum_col+0访问 在非严格SQL模式下,分配not in list值不一定会导致错误,而是分配一个特殊的错误值,数值为0 排序按数字顺序进行,例如定义顺序,而不是按字符串等价物的字母顺序 赋值通过值字符串或索引号进行 这是:应避免使用枚举“0”、“1”、“2”,因为“0”将具有整数值1
PostgreSQL从8.3开始支持枚举。对于旧版本,您可以使用:

可以通过执行以下操作来模拟枚举:

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更快。

与mat所说的不同,PostgreSQL自版本 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”不同。标签中的空格也很重要


另外,IBM DB2和IBM Informix动态服务器都不支持枚举类型。

MSSQL不支持枚举


当您使用Entity Framework 5时,您可以使用Enum查看:和,但即使这样,值也会以int形式存储在数据库中。

您能否找到最早支持Enum的版本并将该信息发布在此处?谢谢也许你还可以编译一些关于它们如何在内部工作的额外信息。我添加了所有要求的详细信息。PostgreSQL从8.3版开始就支持ENUM查看我的答案。这实际上不是一个a型宏和对整数的攻击。这就像说鞋面是一种类型。@EvanCarroll不完全是这样。你说得对,从技术上讲,枚举是在整数上实现的。然而,它们在MySQL的DDL中显式地作为数据类型存在,而UPPER则不是。枚举不能-它对于表是唯一的,必须在表上定义。此外,更改枚举是ALTERTABLE的一个功能,甚至添加到枚举中都需要重写表AFAIK。您会调用set a type吗?它作为DDL中的一个项存在,DB引擎会对它进行适当的处理,这就是我要说的。我真的不在乎它是如何实现的。对DBMS的用户来说,内部实现的样子有什么不同?@Evan听着,你本可以在不浪费我时间的情况下否决我的意见,而不必浪费我的时间在这个毫无意义的讨论上。