MySQL - SET 資料類型:理解與使用

MySQL SET 的介紹

你好,有志於數據庫的愛好者們!今天,我們將要進入 MySQL 的 SET 資料類型的迷人世界。作為你鄰居的友好計算機老師,我將帶領你興奮地探索這個主題,這種興奮就像我發現一個新的披薩配料組合一樣。相信我,到了這堂課的結尾,你將會像我最喜歡的編程拖鞋一樣對 SET 資料類型感到自在!

MySQL - SET

MySQL SET 資料類型

SET 是什麼?

MySQL 中的 SET 資料類型就像一個帶有多種配料的女巫帽披薩——它允許你在單個列中存儲來自預定義選項列表的多個值。想像你正在為一家書店創建數據庫,並希望跟踪每本書的類型。一本書可能屬於多個類型,對吧?這就是 SET 登場的時候!

語法與使用

讓我們看看我們是如何定義一個 SET 列的:

CREATE TABLE books (
id INT PRIMARY KEY,
title VARCHAR(100),
genres SET('Fiction', 'Non-Fiction', 'Mystery', 'Romance', 'Sci-Fi')
);

在這個例子中,我們創建了一個 'genres' 列,它可以包含任何指定值的組合。這就像給每本書定制一個類型披薩!

插入數據

現在,讓我們向我們的表中添加一些書籍:

INSERT INTO books (id, title, genres) VALUES
(1, 'The Mysterious Universe', 'Non-Fiction,Sci-Fi'),
(2, 'Love in the Time of Algorithms', 'Fiction,Romance,Sci-Fi'),
(3, 'The Art of Debugging', 'Non-Fiction');

在這裡,我們為每本書分配了多個類型。這就像用逗號分隔值一樣簡單。

SET 資料類型的存儲

SET 值是如何存儲的

在幕後,MySQL 將 SET 值存儲為位向量。SET 中的每個選項都被分配了一個位位置。例如:

位位置 數值
Fiction 0 1
Non-Fiction 1 2
Mystery 2 4
Romance 3 8
Sci-Fi 4 16

當你插入一個 SET 值時,MySQL 計算每個選項數值的總和。例如,'Fiction,Sci-Fi' 將被存儲為 17 (1 + 16)。

内存效率

這種存儲方法非常高效。MySQL 可以使用僅 8 個字节的存儲空間來存儲多达 64 個不同的值。這就像把整個圖書館的類型塞進一個小書架一樣!

更新 SET 值

添加和移除值

更新 SET 值就像更新你的披薩訂單一樣簡單。你可以使用各種 MySQL 函數來添加或移除值:

-- 添加一個類型
UPDATE books SET genres = CONCAT(genres, ',Mystery') WHERE id = 1;

-- 移除一個類型
UPDATE books SET genres = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', genres, ','), ',Sci-Fi,', ',')) WHERE id = 1;

在第一個查詢中,我們在類型中添加了 'Mystery'。在第二個中,我們移除了 'Sci-Fi'。這就像訂購後定制你的披薩一樣!

使用 SET 運算符

MySQL 提供了一些方便的運算符來處理 SET 值:

-- 查找同時是 Fiction 和 Sci-Fi 的書籍
SELECT * FROM books WHERE FIND_IN_SET('Fiction', genres) > 0 AND FIND_IN_SET('Sci-Fi', genres) > 0;

-- 查找是 Romance 或 Mystery 的書籍
SELECT * FROM books WHERE genres & (1 << 2 | 1 << 3);

第二個查詢使用位運算來檢查 Romance (位位置 3) 或 Mystery (位位置 2)。這就像使用一個秘密代碼來找到你喜歡的書籍類型!

在客戶端程序中使用 SET 資料類型

當通過客戶端程序使用 SET 時,你有幾種處理數據的選擇:

作為字符串

大多數客戶端程序會將 SET 值呈現為逗號分隔的字符串:

import mysql.connector

db = mysql.connector.connect(host="localhost", user="yourusername", password="yourpassword", database="bookstore")
cursor = db.cursor()

cursor.execute("SELECT * FROM books WHERE id = 2")
result = cursor.fetchone()
print(f"類型為 '{result[1]}': {result[2]}")
# 輸出:類型為 'Love in the Time of Algorithms': Fiction,Romance,Sci-Fi

作為整數集合

一些進階應用程序可能會使用底層的整數表示:

cursor.execute("SELECT genres+0 FROM books WHERE id = 2")
result = cursor.fetchone()
print(f"類型的整數表示:{result[0]}")
# 輸出:類型的整數表示:25

在這裡,genres+0 強制 MySQL 返回數字表示。

結論

這就是了,未來的數據庫巫師們!我們一起穿過了 MySQL SET 資料類型的土地,從其類似披薩的靈活性到其秘密的數字代碼。記住,就像為你的完美披薩選擇配料一樣,為你的數據庫選擇正確的資料類型是至關重要的。SET 給你提供了以高效和優雅的方式處理多選選項的能力。

當我們結束時,我想到一個學生曾經說過,SET 令他想起收集交易卡——你可以有任意的組合,但只能從預定義的集合中選擇。這個比喻讓我印象深刻,就像洋蔥片粘在嘴巴天花板上一样!

繼續練習,保持好奇心,在你知道之前,你將會像我一樣輕鬆地提供數據庫解決方案,並且我的披薩雙關語會變得不好笑。直到下一次,願你的查詢速度快,數據完整性強!

Credits: Image by storyset