【问题标题】:Which database systems support an ENUM data type, which don't?哪些数据库系统支持 ENUM 数据类型,哪些不支持?
【发布时间】:2008-12-03 12:51:35
【问题描述】:

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

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

【问题讨论】:

    标签: database enums types rdbms


    【解决方案1】:

    我知道 MySQL 确实支持 ENUM:

    • 数据类型被实现为带有关联字符串的整数值
    • 单个枚举最多可以有 65.535 个元素
    • 每个字符串都有一个数字等价物,从 1 开始按定义顺序计数
    • 字段的数值可通过“SELECT enum_col+0”访问
    • 在非严格 SQL 模式下,分配 not-in-list 值不一定会导致错误,而是分配一个特殊的错误值,数值为 0
    • 排序按数字顺序(例如定义顺序)进行,而不是按字符串等效项的字母顺序进行
    • 赋值通过值字符串或索引号工作
    • 这个:ENUM('0','1','2') 应该避免,因为'0' 将具有整数值1

    【讨论】:

    • 这实际上不是宏类型和对整数的破解。这就像说UPPER() 是一种类型。
    • @EvanCarroll 不完全是。没错,从技术上讲,ENUM 是在整数上实现的。然而,它们在 MySQL 的 DDL 中作为数据类型明确存在,而 UPPER() 则没有。
    • 在什么意义上,可以在任何表上添加类型。 ENUM 不能——它对表是唯一的,并且必须在表上定义。此外,更改 ENUM 是 ALTER TABLE 的一个功能,甚至添加到它们也需要重写表 (AFAIK)。你会把set 称为类型吗?
    • 它作为 DDL 中的一个项目存在,数据库引擎对其进行了适当的处理,这就是我的意思。我真的不在乎它是如何实现的。内部实现的样子对 DBMS 的用户有什么不同?
    • @Evan 看,你本可以对我投反对票,而不会在这个无用的讨论上浪费我的时间。
    【解决方案2】:

    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 从 8.3 版开始支持 ENUM(见我的回答)。
    【解决方案3】:

    Oracle 根本不支持 ENUM。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        不像垫子说的,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”不同。标签中的空格也很重要。

        【讨论】:

        • 您能找出第一个支持 ENUM 的版本并在此处发布该信息吗?谢谢! (也许您还可以编译一些关于它们内部工作方式的额外信息。)
        • 完成。我添加了所有要求的详细信息。
        【解决方案6】:

        MSSQL 不支持 ENUM。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多