淺析MySQL顯式類型轉(zhuǎn)換
CAST 函數(shù)
在之前的文章中,我們提到過CAST函數(shù),用于顯示進(jìn)行類型轉(zhuǎn)換。在避免隱式類型轉(zhuǎn)換時,好處多多。其實(shí)這里面還有很多細(xì)節(jié),是需要梳理下的。
首先來看看下面這個轉(zhuǎn)換:
mysql> SELECT CAST('2017-12-14' AS DATE);
+----------------------------+
| CAST('2017-12-14' AS DATE) |
+----------------------------+
| 2017-12-14 |
+----------------------------+
1 row in set (0.00 sec)
其中:
2017-12-14 是待轉(zhuǎn)換的數(shù)據(jù)。
DATE為轉(zhuǎn)換后的類型。
標(biāo)準(zhǔn)語法是這樣的:
CAST(expr AS type)
這里需要注意的是type類型不支持所有的數(shù)據(jù)類型,而是支持特定的數(shù)據(jù)類型,也是今天這篇文章的重點(diǎn)。(我就吃過這個虧,想當(dāng)然的以為支持所有數(shù)據(jù)類型,結(jié)果就被打臉了) 。
不支持的報(bào)錯:
mysql> SELECT CAST('1024' AS int);
ERROR 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 1
支持的類型
下面是CAST函數(shù)支持轉(zhuǎn)換的數(shù)據(jù)類型列表:
| 類型 | 備注 |
|---|---|
| DATE | YYYY-MM-DD |
| DATETIME | YYYY-MM-DD HH:mm:ss |
| TIME | HH:mm:ss |
| DECIMAL | 通常用于帶小數(shù)位 |
| CHAR | 固定長度字符串 |
| NCHAR | 類型于CHAR一致 |
| SIGNED | 一個有符號的64整數(shù)位 |
| UNSIGNED | 一個無符號的64整數(shù)位 |
| BINARY | 二進(jìn)制字符串 |
| JSON | MySQL 5.7.8 及更高版本 |
注意:
其中DATE支持的范圍是: 1000-01-01 至 9999-12-31,(實(shí)驗(yàn)版本為:)
如果為: 999-01-01 結(jié)果則會0999-01-01。
如果為: 01-01-01則會為:2001-01-01。
mysql> select cast('999-11-11' as DATE);
+---------------------------+
| cast('999-11-11' as DATE) |
+---------------------------+
| 0999-11-11 |
+---------------------------+
1 row in set (0.00 sec)
mysql> select cast('01-11-11' as DATE);
+--------------------------+
| cast('01-11-11' as DATE) |
+--------------------------+
| 2001-11-11 |
+--------------------------+
1 row in set (0.00 sec)
mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.20 | +-----------+ 1 row in set (0.00 sec)
2. CAST函數(shù)中expr的值可以轉(zhuǎn)換為type,其轉(zhuǎn)換的結(jié)果才正確,否則轉(zhuǎn)換后的結(jié)果默認(rèn)值,如Null,0等。
例如:一個Char類型轉(zhuǎn)換為Demical類型,轉(zhuǎn)換的結(jié)果就為0。
mysql> SELECT CAST('ANDYQIAN' AS DECIMAL);
+-----------------------------+
| CAST('ANDYQIAN' AS DECIMAL) |
+-----------------------------+
| 0 |
+-----------------------------+
1 row in set, 1 warning (0.00 sec)
轉(zhuǎn)換案例
這里給出一些常用的類型轉(zhuǎn)換例子。
DATE 類型
mysql> select cast('2017-12-14' as DATE);
+----------------------------+
| cast('2017-12-14' as DATE) |
+----------------------------+
| 2017-12-14 |
+----------------------------+
1 row in set (0.00 sec)
TIME 類型
mysql> select cast('12:00:00' as TIME);
+--------------------------+
| cast('12:00:00' as TIME) |
+--------------------------+
| 12:00:00 |
+--------------------------+
1 row in set (0.00 sec)
DATETIM 類型
mysql> select cast('2017-12-14 00:11:11' as DATETIME);
+-----------------------------------------+
| cast('2017-12-14 00:11:11' as DATETIME) |
+-----------------------------------------+
| 2017-12-14 00:11:11 |
+-----------------------------------------+
1 row in set (0.00 sec)
SIGNED類型
mysql> select cast('-1024' as SIGNED);
+-------------------------+
| cast('-1024' as SIGNED) |
+-------------------------+
| -1024 |
+-------------------------+
1 row in set (0.00 sec)
UNSIGNED類型
mysql> select cast('-1024' as UNSIGNED);
+---------------------------+
| cast('-1024' as UNSIGNED) |
+---------------------------+
| 18446744073709550592 |
+---------------------------+
1 row in set, 1 warning (0.00 sec)
DECIMAL類型
mysql> select cast('18.11' as DECIMAL(18,2));
+--------------------------------+
| cast('18.11' as DECIMAL(18,2)) |
+--------------------------------+
| 18.11 |
+--------------------------------+
1 row in set (0.00 sec)
以上就是本次整理的全部內(nèi)容,大家測試的時候可以輸入命令嘗試下,如果還有任何不明白的地方,大家可以在下方的留言區(qū)域討論。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信