MySQL 中有兩種特殊的數(shù)據(jù)類(lèi)型 SET 和 ENUM,它們?cè)试S我們?cè)诒砀竦哪硞€(gè)特定列中設(shè)置一組合法的值。在我們創(chuàng)建表格或列時(shí),我們可以根據(jù)需要定義列的類(lèi)型。下面是關(guān)于這兩種類(lèi)型的介紹。
SET 數(shù)據(jù)類(lèi)型
SET 數(shù)據(jù)類(lèi)型是將某個(gè)列限定在一組預(yù)先定義好的值中,允許用戶(hù)在這組值之間進(jìn)行選擇,每個(gè)選擇都有一個(gè)固定的數(shù)字值與之對(duì)應(yīng)。定義一個(gè) SET 類(lèi)型的列 即可設(shè)置允許的值。比如,我們創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表 user,它有一個(gè)字段 sex,只能取值男、女、未知,那么我們可以使用下面這個(gè)語(yǔ)句進(jìn)行創(chuàng)建:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `sex` set('男','女','未知') NOT NULL DEFAULT '未知', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET 類(lèi)型的列有以下幾個(gè)特點(diǎn):
- SET 數(shù)據(jù)類(lèi)型的列最多可以有 64 個(gè)元素。
- SET 中的元素必須是常量,不能使用變量和表達(dá)式。
- SET 中的元素是按照插入的先后順序,從 1 開(kāi)始編號(hào)的。
- 當(dāng)設(shè)置不合法的值時(shí),MySQL 自動(dòng)截取掉超出列表的部分值,再進(jìn)行插入。
ENUM 數(shù)據(jù)類(lèi)型
ENUM 類(lèi)型與 SET 類(lèi)型類(lèi)似,不同的是 ENUM 類(lèi)型只允許取枚舉值中的一個(gè)元素。同樣以 sex 列為例,我們可以使用下面的語(yǔ)句來(lái)定義:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `sex` enum('男','女','未知') NOT NULL DEFAULT '未知', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ENUM 類(lèi)型的列有以下幾個(gè)特點(diǎn):
- 對(duì)于 ENUM 列,MySQL 會(huì)將每個(gè)元素都映射為一個(gè)整數(shù)值,取值范圍是 1 到元素?cái)?shù)量。
- 如果聲明 ENUM 類(lèi)列時(shí)沒(méi)有給出默認(rèn)值,則其默認(rèn)值為第一個(gè)枚舉值。
- 當(dāng)使用不在枚舉列表中的值進(jìn)行 INSERT 操作時(shí),MySQL 會(huì)產(chǎn)生一個(gè)警告,然后在枚舉列表中自動(dòng)添加這個(gè)值。