浅析MySQL显式类型转换
CAST函数
在之前的文章中,我们提到过CAST函数,用于显示进行类型转换。在避免隐式类型转换时,好处多多。其实这里面还有很多细节,是需要梳理下的。
首先来看看下面这个转换:
mysql>SELECTCAST('2017-12-14'ASDATE);
+----------------------------+
|CAST('2017-12-14'ASDATE)|
+----------------------------+
|2017-12-14|
+----------------------------+
1rowinset(0.00sec)
其中:
2017-12-14是待转换的数据。
DATE为转换后的类型。
标准语法是这样的:
CAST(exprAStype)
这里需要注意的是type类型不支持所有的数据类型,而是支持特定的数据类型,也是今天这篇文章的重点。(我就吃过这个亏,想当然的以为支持所有数据类型,结果就被打脸了)。
不支持的报错:
mysql>SELECTCAST('1024'ASint);
ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'int)'atline1
支持的类型
下面是CAST函数支持转换的数据类型列表:
| 类型 | 备注 |
|---|---|
| DATE | YYYY-MM-DD |
| DATETIME | YYYY-MM-DDHH:mm:ss |
| TIME | HH:mm:ss |
| DECIMAL | 通常用于带小数位 |
| CHAR | 固定长度字符串 |
| NCHAR | 类型于CHAR一致 |
| SIGNED | 一个有符号的64整数位 |
| UNSIGNED | 一个无符号的64整数位 |
| BINARY | 二进制字符串 |
| JSON | MySQL5.7.8及更高版本 |
注意:
其中DATE支持的范围是:1000-01-01至9999-12-31,(实验版本为:)
如果为:999-01-01结果则会0999-01-01。
如果为:01-01-01则会为:2001-01-01。
mysql>selectcast('999-11-11'asDATE);
+---------------------------+
|cast('999-11-11'asDATE)|
+---------------------------+
|0999-11-11|
+---------------------------+
1rowinset(0.00sec)
mysql>selectcast('01-11-11'asDATE);
+--------------------------+
|cast('01-11-11'asDATE)|
+--------------------------+
|2001-11-11|
+--------------------------+
1rowinset(0.00sec)
mysql>selectversion(); +-----------+ |version()| +-----------+ |5.7.20| +-----------+ 1rowinset(0.00sec)
2.CAST函数中expr的值可以转换为type,其转换的结果才正确,否则转换后的结果默认值,如Null,0等。
例如:一个Char类型转换为Demical类型,转换的结果就为0。
mysql>SELECTCAST('ANDYQIAN'ASDECIMAL);
+-----------------------------+
|CAST('ANDYQIAN'ASDECIMAL)|
+-----------------------------+
|0|
+-----------------------------+
1rowinset,1warning(0.00sec)
转换案例
这里给出一些常用的类型转换例子。
DATE类型
mysql>selectcast('2017-12-14'asDATE);
+----------------------------+
|cast('2017-12-14'asDATE)|
+----------------------------+
|2017-12-14|
+----------------------------+
1rowinset(0.00sec)
TIME类型
mysql>selectcast('12:00:00'asTIME);
+--------------------------+
|cast('12:00:00'asTIME)|
+--------------------------+
|12:00:00|
+--------------------------+
1rowinset(0.00sec)
DATETIM类型
mysql>selectcast('2017-12-1400:11:11'asDATETIME);
+-----------------------------------------+
|cast('2017-12-1400:11:11'asDATETIME)|
+-----------------------------------------+
|2017-12-1400:11:11|
+-----------------------------------------+
1rowinset(0.00sec)
SIGNED类型
mysql>selectcast('-1024'asSIGNED);
+-------------------------+
|cast('-1024'asSIGNED)|
+-------------------------+
|-1024|
+-------------------------+
1rowinset(0.00sec)
UNSIGNED类型
mysql>selectcast('-1024'asUNSIGNED);
+---------------------------+
|cast('-1024'asUNSIGNED)|
+---------------------------+
|18446744073709550592|
+---------------------------+
1rowinset,1warning(0.00sec)
DECIMAL类型
mysql>selectcast('18.11'asDECIMAL(18,2));
+--------------------------------+
|cast('18.11'asDECIMAL(18,2))|
+--------------------------------+
|18.11|
+--------------------------------+
1rowinset(0.00sec)
以上就是本次整理的全部内容,大家测试的时候可以输入命令尝试下,如果还有任何不明白的地方,大家可以在下方的留言区域讨论。