每當你將資料分類為不同類型時,就不可避免地需要從一種資料類型轉換為另一種資料類型。在我看來,一個常見的使用案例是處理透過査詢參數或 POST 要求主體從 Web 表單傳入的變數。將資料序列化以便透過網路傳送資料往往會將所有變數強制轉換為字串。因此,它們通常需要轉換為更合適的資料類型,例如數字、日期或你有的資料類型。
在關聯式資料庫中,將一種資料類型轉換為另一種資料類型的原因包括將資料從一種資料庫類型移植到另一種資料庫類型、變更欄的資料類型或臨時切換資料類型以進行計算。在 MySQL 中,我們可以使用 CAST() 和 CONVERT() 函式轉換資料類型。在今天的文章中,我們將學習如何使用這兩個函式,並舉例說明它們的用法。
有什麼差異?
CAST() 和 CONVERT() 都可以變更 MySQL 中的資料類型。由於兩者如此相似,許多 SQL 新手(還有一些更有經驗的使用者!)不知道有什麼差異。主要差異在於 CONVERT() 還可以將資料的字元集轉換為另一個字元集。CAST() 就不能用於變更字元集。因此,除非你需要轉換字元集,CAST() 應該是你的 goto 轉換函式。
CAST() 函式
MySQL CAST() 接受兩個輸入:
- 要類型轉換的資料
- 要將此資料轉換為的資料類型(十進位、字元等)。你可以將資料轉換為 BINARY、CHAR、DATE、DATETIME、TIME、DECIMAL、SIGNED 和 UNSIGNED 資料類型。
語法如下:
CAST(data as data_type)
一個近乎真實的例子
CAST() 函式的一個有用的應用是使一個非常大的資料類型不那麼笨拙(更實用?)。以下的査詢會傳回 MySQL Sakila 範例資料庫中特定電影的資訊。它的其中一欄 description 是一個文字欄位。這意味著它可以儲存大量的文字!我們可以使用 CAST() 將描述截斷為 100 個字元,這樣我們就不會得到一本關於這部電影的完整書籍:
說到 Sakila 範例資料庫,你知道它是以 MySQL 的海豚吉祥物命名的嗎?它是從「Name the Dolphin」比賽中使用者推薦的一大串名字中挑選出來的。獲獎者是來自非洲 Eswatini(舊稱 Swaziland)的開源軟體開發人員 Ambrose Twebaze。
CONVERT() 函式
CONVERT() 函式的語法與 CAST() 類似,但運算式和結果類型的格式略有不同。一種方式是提供兩個獨立的參數:
CONVERT(expr, data_type)
除此之外,data_type 參數可以是 CAST() 函式支援的任何相同類型。
一個不太真實的例子
因為 CAST() 和 CONVERT() 之間的主要差異是後者可以將欄的字元集轉換為不同的字元集,所以讓我們實際示範一下。
首先要注意的是,轉換字元集的語法有點不同。在這種情況下,我們需要在運算式和字元集之間加入 USING 關鍵字:
CONVERT(expr USING charset);
在 Navicat for MySQL(或 Navicat Premium)中,我們可以在資訊窗格中看到資料表的字元集和定序:
考慮到這一點,我們可以將 CONVERT() 函式套用於前面的査詢,以將 description 欄位從 UTF-8 轉換為 Latin1。如果你好奇的話,這兩個字元的差異在於,在 latin1 中,每個字元正好是一個位元組長,而在 utf8 中,一個字元可以由多個位元組組成。因此,utf8 比 latin1 有更多的字元。此外,它們共同的字元不一定由相同的位元組或位元組序列表示。
總結
在今天的文章中,我們看到了如何使用 CAST() 將資料轉換為不同的類型,以及如何使用 CONVERT() 在字元集之間進行轉換。重申一下,CAST() 應該是你的 goto 轉換函式。而 CONVERT() 更適合在字元集之間切換。
如果你對 Navicat for MySQL 感興趣,可以免費試用 14 天!
Rob Gravelle 居住於加拿大渥太華,是一名有 20 多年經驗的 IT 專家。過住,Rob 曾為情報相關的組織(如加拿大邊境服務局和各種商業組織)建置系統。在業餘時間,Rob 是一名出色的吉他演奏家,並擁有多張 CD和數位發行。