【发布时间】:2008-12-03 12:51:35
【问题描述】:
跟进这个问题:“Database enums - pros and cons”,我想知道哪些数据库系统支持枚举数据类型,以及它们如何做到这一点的一些细节(例如,内部存储什么,限制是什么,查询语法含义,索引含义,...)。
应在其他问题中讨论用例或利弊。
【问题讨论】:
标签: database enums types rdbms
跟进这个问题:“Database enums - pros and cons”,我想知道哪些数据库系统支持枚举数据类型,以及它们如何做到这一点的一些细节(例如,内部存储什么,限制是什么,查询语法含义,索引含义,...)。
应在其他问题中讨论用例或利弊。
【问题讨论】:
标签: database enums types rdbms
我知道 MySQL 确实支持 ENUM:
SELECT enum_col+0”访问ENUM('0','1','2') 应该避免,因为'0' 将具有整数值1
【讨论】:
UPPER() 是一种类型。
ALTER TABLE 的一个功能,甚至添加到它们也需要重写表 (AFAIK)。你会把set 称为类型吗?
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 更快。
【讨论】:
Oracle 根本不支持 ENUM。
【讨论】:
AFAIK,IBM DB2 和 IBM Informix Dynamic Server 都不支持 ENUM 类型。
【讨论】:
不像垫子说的,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”不同。标签中的空格也很重要。
【讨论】:
MSSQL 不支持 ENUM。
当您使用 Entity Framework 5 时,您可以使用枚举(查看:Enumeration Support in Entity Framework 和 EF5 Enum Types Walkthrough),但即便如此,值仍以 int 形式存储在数据库中。
【讨论】: