13

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

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

4

6 回答 6

7

我知道 MySQL 确实支持 ENUM:

  • 数据类型被实现为带有关联字符串的整数值
  • 单个枚举最多可以有 65.535 个元素
  • 每个字符串都有一个数字等价物,从 1 开始,按照定义的顺序
  • 该字段的数值可通过“ SELECT enum_col+0”访问
  • 在非严格 SQL 模式下,分配不在列表中的值不一定会导致错误,而是分配一个特殊的错误值,数值为 0
  • 排序按数字顺序(例如定义顺序)进行,而不是按字符串等效项的字母顺序
  • 赋值通过值字符串或索引号工作
  • this:ENUM('0','1','2')应该避免,因为'0'会有整数值1
于 2008-12-03T13:37:14.083 回答
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.

于 2008-12-03T13:44:24.973 回答
4

Oracle 根本不支持 ENUM。

于 2008-12-03T12:58:55.517 回答
4

AFAIK,IBM DB2 和 IBM Informix Dynamic Server 都不支持 ENUM 类型。

于 2008-12-16T03:57:32.733 回答
2

与 mat 所说的不同,PostgreSQL确实支持 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

有些函数专门用于 enums

索引在枚举类型上工作得很好。

根据手册,实现如下:

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

枚举标签区分大小写,因此“快乐”与“快乐”不同。标签中的空格也很重要。

于 2008-12-08T13:26:06.113 回答
1

MSSQL 不支持 ENUM。

当您使用 Entity Framework 5 时,您可以使用枚举(查看:Enumeration Support in Entity FrameworkEF5 Enum Types Walkthrough),但即便如此,这些值仍以 int 形式存储在数据库中。

于 2012-07-10T10:51:18.523 回答