談談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 及更高版本

注意:

  1. 其中DATE支持的範圍是: 1000-01-019999-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的學習順序及入門要求是什麼?
如何設計一個資料庫,能夠存下如此「大量」的數據?

TAG:MySQL | MySQL同步 | 数据库管理员DBA |