mysqlcastas_MysqlSQLCAST()函数
(1).CAST()函数的参数是⼀个表达式,它包括⽤AS关键字分隔的源值和⽬标数据类型。以下例⼦⽤于将⽂本字符串'12'转换为整型:
SELECT CAST('12' AS int)
(2).返回值是整型值12。如果试图将⼀个代表⼩数的字符串转换为整型值,⼜会出现什么情况呢?
SELECT CAST('12.5' AS int)
(3).CAST()函数和CONVERT()函数都不能执⾏四舍五⼊或截断操作。由于12.5不能⽤int数据类型来表⽰,所以对这个函数调⽤将产⽣⼀个错误:
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value
'12.5' to a column of data type int.
(4). 要返回⼀个合法的数值,就必须使⽤能处理这个值的数据类型。对于这个例⼦,存在多个可⽤的数
据类型。如果通过CAST()函数将这个值转换为 decimal类型,需要⾸先定义decimal值的精度与⼩数位数。在本例中,精度与⼩数位数分别为9 与2。精度是总的数字位数,包括⼩数点左边和右边位数的总和。⽽⼩数位数是⼩数点右边的位数。这表⽰本例能够⽀持的最⼤的整数值是9999999,⽽最⼩ 的⼩数是0.01。
SELECT CAST('12.5' AS decimal(9,2))
decimal数据类型在结果⽹格中将显⽰有效⼩数位: 12.50
(5).精度和⼩数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server将截断数字的⼩数部分,⽽不会产⽣错误。
SELECT CAST('12.5' AS decimal)
结果是⼀个整数值:12
(6).在表的数据中转换数据类型是很简单的。下⾯的例⼦使⽤Product表,⾸先执⾏如下查询:
SELECT ProductNumber, ProductLine, ProductModelID
FROM Production.Product
ProductSubCategoryID < 4
(7). 假定产品经理已经创建了⼀个系统,⽤于唯⼀地标识⽣产出来的每辆⾃⾏车,以便跟踪其型号、类型和类别。他决定合并产品号、产品⽣产线标识符、产品型号标识 符和⼀个顺序号,为⽣产出来的每辆⾃⾏车创建⼀个唯⼀的序列号。在这个过程的第⼀步,他要求提供包括除顺序号之外的所有属性的所有可能产品的根标识符。
如果使⽤下⾯的表达式,就不能得到希望的结果,如图6-2所⽰。
1.SELECT ProductNumber
2.+ '-'
3.+ ProductLine
4.+ '-'
5.+ ProductModelID AS BikeSerialNum
6.FROM Production.Product
7.WHERE ProductSubCategoryID < 4
我 们没有得到希望的结果,⽽得到了有点奇怪的错误消息:请把nvarchar值转换为 int。因为之前我们没有要求进⾏任何转换,所以这个错误很奇怪。这个查询的问题在于我们试图利⽤第⼀个连接符来连接字符值ProductNumber, 利⽤第⼆个连接符连接另⼀个字符值ProductLine,最后连接的是ProductModelID字符值(它是⼀个整数)。
查询引擎会把连接符当成⼀个数学运算符,⽽不是⼀个字符。不管结果是什么,都需要更正这个表达式,以确保使⽤正确的数据类型。以下表达式执⾏了必要的类型转换,返回如图6-3所⽰的结果:
SELECT ProductNumber
+ '-'
+ ProductLine
+ '-'
+ CAST(ProductModelID AS char(4)) AS BikeSerialNum
FROM Production.Product
WHERE ProductSubCategoryID < 4
如果把整型值转换为字符类型就不会增加多余的空格了。查询引擎将把这些值⽤加号和连接符组合在⼀起,进⾏字符串连接运算,⽽不是和前⾯的数值进⾏加法或者减法运算了。
-------------------------------------------
MySQL 的CAST()和CONVERT()函数可⽤来获取⼀个类型的值,并产⽣另⼀个类型的值。两者具体的语法如下:
1
CAST(valueas type);
2
CONVERT(value, type);
就是CAST(xxx AS 类型), CONVERT(xxx,类型)。
可以转换的类型是有限制的。这个类型可以是以下值其中的⼀个:
⼆进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
⽇期 : DATE
时间: TIME
⽇期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
⽆符号整数 : UNSIGNED
下⾯举⼏个例⼦:
例⼀
1
mysql>SELECT CONVERT('23',SIGNED);decimal是整数数据类型
2
|CONVERT('23',SIGNED) |
4
+----------------------+
5
|                  23 |
6
+----------------------+
7
1 rowin set
例⼆
1
mysql>SELECT CAST('125e342.83' AS signed); 2
+------------------------------+
3
|CAST('125e342.83' AS signed) |
4
+------------------------------+
5
|                          125 |
6
+------------------------------+
7
1 rowin set
例三
1
mysql>SELECT CAST('3.35' AS signed);
2
+------------------------+
3
|CAST('3.35' AS signed) |
4
|                      3 |
6
+------------------------+
7
1 rowin set
像上⾯例⼦⼀样,将varchar 转为int ⽤ cast(a as signed),其中a为varchar类型的字符串。
例4
在SQL Server中,下⾯的代码演⽰了datetime变量中,仅包含单纯的⽇期和单纯的时间时,⽇期存储的⼗六进制存储表⽰结果。01
DECLARE @dt datetime
02
03
--单纯的⽇期
04
SET @dt='1900-1-2'
05
SELECT CAST(@dtas binary(8))
06
--结果: 0x0000000100000000
07
08
--单纯的时间
09
SET @dt='00:00:01'
10
SELECT CAST(@dtas binary(8))
11
--结果: 0x000000000000012C
MySQL的类型转换和SQL Server⼀样,就是类型参数有点点不同:CAST(xxx AS 类型) , CONVERT(xxx,类型)。