談談MySQL顯式類型轉換
本文首發於個人微信公眾號《andyqian》,期待您的關注!
前言
我們之前談了《談談MySQL隱式類型轉換》,今天我們來說說MySQL顯示類型轉換。其實我們之前有簡單說過一次,這次主要是掰開揉細了說。
CAST 函數
在之前的文章中,我們提到過CAST函數,用於顯示進行類型轉換。在避免隱式類型轉換時,好處多多。其實這裡面還有很多細節,是需要梳理下的。
首先來看看下面這個轉換:mysql> SELECT CAST(2017-12-14 AS DATE);n+----------------------------+n| CAST(2017-12-14 AS DATE) |n+----------------------------+n| 2017-12-14 |n+----------------------------+n1 row in set (0.00 sec)n
其中:
2017-12-14 是待轉換的數據。DATE為轉換後的類型。標準語法是這樣的:
CAST(expr AS type)n
這裡需要注意的是type類型不支持所有的數據類型,而是支持特定的數據類型,也是今天這篇文章的重點。(我就吃過這個虧,想當然的以為支持所有數據類型,結果就被打臉了) 。
不支持的報錯:
mysql> SELECT CAST(1024 AS int);nERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near int) at line 1n
支持的類型
下面是CAST函數支持轉換的數據類型列表:
類型備註DATEYYYY-MM-DDDATETIMEYYYY-MM-DD HH:mm:ssTIMEHH:mm:ssDECIMAL通常用於帶小數位CHAR固定長度字元串NCHAR類型於CHAR一致SIGNED一個有符號的64整數位UNSIGNED一個無符號的64整數位BINARY二進位字元串JSONMySQL 5.7.8 及更高版本
注意:
- 其中DATE支持的範圍是:
1000-01-01
至9999-12-31
,(實驗版本為:)
- 如果為:
999-01-01
結果則會0999-01-01
。 - 如果為:
01-01-01
則會為:2001-01-01
。
mysql> select cast(999-11-11 as DATE);n+---------------------------+n| cast(999-11-11 as DATE) |n+---------------------------+n| 0999-11-11 |n+---------------------------+n1 row in set (0.00 sec)nmysql> select cast(01-11-11 as DATE);n+--------------------------+n| cast(01-11-11 as DATE) |n+--------------------------+n| 2001-11-11 |n+--------------------------+n1 row in set (0.00 sec)nmysql> select version();n+-----------+n| version() |n+-----------+n| 5.7.20 |n+-----------+n1 row in set (0.00 sec)n
2. CAST函數中expr的值可以轉換為type,其轉換的結果才正確,否則轉換後的結果默認值,如Null,0等。
例如:一個Char類型轉換為Demical類型,轉換的結果就為0。mysql> SELECT CAST(ANDYQIAN AS DECIMAL);n+-----------------------------+n| CAST(ANDYQIAN AS DECIMAL) |n+-----------------------------+n| 0 |n+-----------------------------+n1 row in set, 1 warning (0.00 sec)n
轉換案例
這裡給出一些常用的類型轉換例子。
DATE 類型
mysql> select cast(2017-12-14 as DATE);n+----------------------------+n| cast(2017-12-14 as DATE) |n+----------------------------+n| 2017-12-14 |n+----------------------------+n1 row in set (0.00 sec)n
TIME 類型
mysql> select cast(12:00:00 as TIME);n+--------------------------+n| cast(12:00:00 as TIME) |n+--------------------------+n| 12:00:00 |n+--------------------------+n1 row in set (0.00 sec)n
DATETIM 類型
mysql> select cast(2017-12-14 00:11:11 as DATETIME);n+-----------------------------------------+n| cast(2017-12-14 00:11:11 as DATETIME) |n+-----------------------------------------+n| 2017-12-14 00:11:11 |n+-----------------------------------------+n1 row in set (0.00 sec)n
SIGNED類型
mysql> select cast(-1024 as SIGNED);n+-------------------------+n| cast(-1024 as SIGNED) |n+-------------------------+n| -1024 |n+-------------------------+n1 row in set (0.00 sec)n
UNSIGNED類型
mysql> select cast(-1024 as UNSIGNED);n+---------------------------+n| cast(-1024 as UNSIGNED) |n+---------------------------+n| 18446744073709550592 |n+---------------------------+n1 row in set, 1 warning (0.00 sec)n
DECIMAL類型
mysql> select cast(18.11 as DECIMAL(18,2));n+--------------------------------+n| cast(18.11 as DECIMAL(18,2)) |n+--------------------------------+n| 18.11 |n+--------------------------------+n1 row in set (0.00 sec)n
上面這些命令,有興趣的童鞋,可以在自己電腦上敲敲!
寫在最後的話
最近在看劉若英的《我敢在你懷裡孤獨》,其中就說到了獨處,她時常會給自己創造獨處的機會。仔細想想,我也有這樣的經歷。在公司時,我時常帶上耳機聽音樂,聽音樂並不是為了欣賞唯美的旋律或動人的歌詞,而是在給自己創造獨處的機會。讓自己"獨處"起來。平常也是經常在深夜活躍,其中大部分文章就是在深夜寫的。深夜格外安靜,安靜的都能聽到自己的呼吸聲。在這樣的環境中,敲擊著鍵盤,聽著音樂,感覺整個世界都是我的。
相關閱讀:
寫會MySQL索引
讀懂MySQL執行計劃
談談MySQL隱式類型轉換
推薦閱讀:
※如何理解資料庫事務中的一致性的概念?
※mysql insert into ...select 語句為什麼會造成死鎖?
※mysql的學習順序及入門要求是什麼?
※如何設計一個資料庫,能夠存下如此「大量」的數據?