欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅析MySQL显式类型转换

程序员文章站 2022-08-10 11:40:26
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)

以上就是本次整理的全部内容,大家测试的时候可以输入命令尝试下,如果还有任何不明白的地方,大家可以在下方的留言区域讨论。