浅析MySQL显式类型转换
程序员文章站
2022-04-08 15:41:53
cast 函数
在之前的文章中,我们提到过cast函数,用于显示进行类型转换。在避免隐式类型转换时,好处多多。其实这里面还有很多细节,是需要梳理下的。
首先来看看下...
cast 函数
在之前的文章中,我们提到过cast函数,用于显示进行类型转换。在避免隐式类型转换时,好处多多。其实这里面还有很多细节,是需要梳理下的。
首先来看看下面这个转换:
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 是待转换的数据。
date为转换后的类型。
标准语法是这样的:
cast(expr as type)
这里需要注意的是type类型不支持所有的数据类型,而是支持特定的数据类型,也是今天这篇文章的重点。(我就吃过这个亏,想当然的以为支持所有数据类型,结果就被打脸了) 。
不支持的报错:
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函数支持转换的数据类型列表:
类型 | 备注 |
---|---|
date | yyyy-mm-dd |
datetime | yyyy-mm-dd hh:mm:ss |
time | hh:mm:ss |
decimal | 通常用于带小数位 |
char | 固定长度字符串 |
nchar | 类型于char一致 |
signed | 一个有符号的64整数位 |
unsigned | 一个无符号的64整数位 |
binary | 二进制字符串 |
json | mysql 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); +---------------------------+ | 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函数中expr的值可以转换为type,其转换的结果才正确,否则转换后的结果默认值,如null,0等。
例如:一个char类型转换为demical类型,转换的结果就为0。
mysql> select cast('andyqian' as decimal); +-----------------------------+ | cast('andyqian' as decimal) | +-----------------------------+ | 0 | +-----------------------------+ 1 row in set, 1 warning (0.00 sec)
转换案例
这里给出一些常用的类型转换例子。
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)
以上就是本次整理的全部内容,大家测试的时候可以输入命令尝试下,如果还有任何不明白的地方,大家可以在下方的留言区域讨论。
上一篇: 委托的发展(一)
下一篇: 农产品做网络直播 应该记住这些要点