Navicat 博客

在数据库中存储枚举 2022 年 10 月 5 日,由 Robert Gravelle 撰写

在信息技术领域,俗称 IT 领域,枚举(ENUM)是一种特殊的数据类型,它封装了一组预定义的常量。因此,变量可能只保存枚举的其中一个预定义的值。常见的示例包括指南针方向(東、南、西、北)或星期几。

在数据库表中存储枚举有些复杂因素,其中之一是它们的值可能是数字或字母(即字符串)。而且,你可能希望阻止用户在表中添加任何不属于枚举集的允许值。我们将在今天的文章中解决这两个问题。

探索枚举值

最基本的枚举包含一组从零开始的号值,每个值由一个常量表示,以下是 Java 的例子:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

更复杂的枚举可能包含其他类型;字符串是最常见的类型,但也支持更复杂的对象。以下是一个用于表示不同环境 URL 的枚举(也是 Java):

public enum Environment 
{
    PROD("https://prod.domain.com:1088/"), 
    SIT("https://sit.domain.com:2019/"), 
    CIT("https://cit.domain.com:8080/"), 
    DEV("https://dev.domain.com:21323/");
 
    private String url;
 
    Environment(String envUrl) {
        this.url = envUrl;
    }
 
    public String getUrl() {
        return url;
    }
}

通常,将枚举存储为数字序数值被认为是不好的做法,因为这会使调试和支持变得困难。而存储转换为字符串的实际枚举值通常更可取。为了说明这一点,假设我们有一个纸牌的枚举:

public enum Suit { 
  Spade, 
  Heart, 
  Diamond, 
  Club 
}

现在假设你是一名数据库从业人员,正在试图解读以下两个查询结果:

Name          Suit
------------  ----
John Smith    2
Ian Boyd      1

Name          Suit
------------  -------
John Smith    Diamond
Ian Boyd      Heart

我认为你会同意后者更容易解释,因为第一个查询结果需要有源代码并找到分配给每个枚举成员的数值。

尽管存储字符串需要更多的磁盘空间,但枚举成员名称往往很短,而且硬盘价格很便宜,因此值得权衡取舍,让你的日常工作更轻松。

使用数值的另一个问题是它们难以更新。如果不强制使用旧数值,你无法轻松插入或重新排列成员。例如,将 Unknown值添加到 Suit 枚举将需要将其更新为:

public enum Suit { Unknown = 4, Heart = 1, Club = 3, Diamond = 2, Spade = 0 }

…以便保留已经存储在数据库中的旧数值。

验证数据库中的枚举值

现今许多数据库,包括 MySQL 和 SQL Server,都支持 ENUM 数据类型。ENUM 值指定为字符串,為了紧凑存储在存储时会自动编码为数字。

以下是 Navicat for MySQL 中的 MySQL 语句,用于创建表和填充包含衬衫和尺寸数据,以及获取中码衬衫数据的 SELECT 查询:

mysql_enum (57K)

如果现在尝试插入一个无效的 ENUM 值,我们会得到以下错误:

mysql_enum_error (52K)

尽管消息指出该值已被截断,但实际上并未插入数据。

总结

在本文中,我们探讨了如何在数据库中使用枚举值,包括如何存储、验证、插入和检索它们。

有兴趣试用 Navicat for MySQL?你可以免费使用 14 天!

Navicat 文章
频道条目
分享
文章归档