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 文章
頻道記錄
分享
部落格封存檔