MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。两者具体的语法如下:
1 |
CAST(valueastype); |
|
2 |
CONVERT(value, type); |
就是CAST(xxx AS 类型), CONVERT(xxx,类型)。
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
- 二进制,同带binary前缀的效果 : BINARY
- 字符型,可带参数 : CHAR()
- 日期 : DATE
- 时间: TIME
- 日期时间型 : DATETIME
- 浮点数 : DECIMAL
- 整数 : SIGNED
- 无符号整数 : UNSIGNED
下面举几个例子:
例一
1 |
mysql>SELECTCONVERT('23',SIGNED); |
||||
2 |
+----------------------+ |
||||
3 |
|CONVERT('23',SIGNED) | |
||||
4 |
+----------------------+ |
||||
5 |
| 23 | |
||||
6 |
+----------------------+ |
||||
7 |
1 rowinset |
||||
例二
1 |
mysql>SELECTCAST('125e342.83'ASsigned); |
||||
2 |
+------------------------------+ |
||||
3 |
|CAST('125e342.83'ASsigned) | |
||||
4 |
+------------------------------+ |
||||
5 |
| 125 | |
||||
6 |
+------------------------------+ |
||||
7 |
1 rowinset |
||||
例三
1 |
mysql>SELECTCAST('3.35'ASsigned); |
||||
2 |
+------------------------+ |
||||
3 |
|CAST('3.35'ASsigned) | |
||||
4 |
+------------------------+ |
||||
5 |
| 3 | |
||||
6 |
+------------------------+ |
||||
7 |
1 rowinset |
||||
像上面例子一样,将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(@dtasbinary(8)) |
|||||||
06 |
--结果: 0x0000000100000000 |
|||||||
07 |
||||||||
08 |
--单纯的时间 |
|||||||
09 |
SET @dt='00:00:01' |
|||||||
10 |
SELECT CAST(@dtasbinary(8)) |
|||||||
11 |
--结果: 0x000000000000012C |
|||||||
MySQL的类型转换和SQL Server一样,就是类型参数有点点不同:CAST(xxx AS 类型) , CONVERT(xxx,类型)。
MYSQL Cast函数是非常重要的MYSQL函数,下面就将为您详细介绍MYSQL Cast函数的语法及其使用,希望能让您对MYSQL Cast函数有更多的认识。
BINARY
BINARY操作符将后面的字符串抛给一个二进制字符串。这是一种简单的方式来促使逐字节而不是逐字符的进行列比较。这使得比较区分大小写,即使该列不被定义为BINARY或BLOB。BINARY也会产生结尾空白,从而更加显眼。
1 mysql> SELECT 'a' = 'A';
2
3 -> 1
4
5 mysql> SELECT BINARY 'a' = 'A';
6 -> 0
7 mysql> SELECT 'a' = 'a ';
8 -> 1
9 mysql> SELECT BINARY 'a' = 'a ';
10 -> 0
BINARY影响整个比较;它可以在任何操作数前被给定,而产生相同的结果。
BINARY str是CAST(str AS
BINARY)的缩略形式。
注意,在一些语境中,假如你将一个编入索引的列派给BINARY, MySQL将不能有效使用这个索引。
假如你想要将一个BLOB值或其它二进制字符串进行区分大小写的比较,你可利用二进制字符串没有字符集这一事实实现这个目的,这样就不会有文书夹的概念。
为执行一个区分大小写的比较,可使用CONVERT()函数将一个字符串值转化为一个不区分大小写的字符集。其结果为一个非二进制字符串,因此LIKE操 作也不会区分大小写:
11 SELECT 'A' LIKE CONVERT(blob_col USING latin1) FROM tbl_name;
若要使用一个不同的字符集, 替换其在上述语句中的latin1名。
CONVERT()一般可用于比较出现在不同字符集中的字符串。
CAST(expr AS
type), CONVERT(expr,type) ,
CONVERT(expr USING transcoding_name)
CAST()
和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。
这个类型 可以是以下值其中的一个:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED
[INTEGER]
TIME
UNSIGNED [INTEGER]
BINARY
产生一个二进制字符串。
假如给定了随意长度N,则 BINARY[N] 使cast使用该参数的不多于 N 个字节。同样的,CHAR[N]会使cast使用该参数的不多于N 个字符。
12 CAST() and CONVERT(... USING ...) 是标准SQL语法。CONVERT()的非USING 格式是ofis ODBC语法。
带有USING的CONVERT() 被用来在不同的字符集之间转化数据。在MySQL中, 自动译码名和相应的字符集名称相同。例如。 这个语句将服务器的默认字符集中的字符串 'abc'转化为utf8字符集中相应的字符串:
13 SELECT CONVERT('abc' USING utf8);
当你想要在一个CREATE ... SELECT 语句中创建一个特殊类型的列,则cast函数会很有用:
14 CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);
该函数也用于ENUM 列按词法顺序的排序。通常ENUM列的排序在使用内部数值时发生。将这些值按照词法顺序派给 CHAR 结果:
15 SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
CAST(str AS BINARY)和BINARY str相同。 CAST(expr AS
CHAR)将表达式视为一个带有默认字符集的字符串。
若用于一个诸如CONCAT('Date: ',CAST(NOW() AS
DATE))这样的比较复杂的表达式的一部分,CAST()也会改变结果。
你不应在不同的格式中使用CAST()来析取数据,但可以使用诸如LEFT() 或 EXTRACT() 的字符串函数来代替。
若要在数值语境中将一个字符串派给一个数值, 通常情况下,除了将字符串值作为数字使用外,你不需要做任何事:
16 mysql> SELECT 1+'1';
17 -> 2
若要在一个字符串语境中使用一个数字,该数字会被自动转化为一个BINARY 字符串。
18 mysql> SELECT CONCAT('hello you ',2);
19 -> 'hello you 2'
MySQL支持带符号和无符号的64比特值的运算。若你正在使用数字操作符(如 +) 而其中一个操作数为无符号整数,则结果为无符号。可使用SIGNED 和UNSIGNED cast 操作符来覆盖它。将运算分别派给带符号或无符号64比特整数。
20 mysql> SELECT CAST(1-2 AS UNSIGNED)
21 -> 18446744073709551615
22 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
23 -> -1
注意,假如任意一个操作数为一个浮点值,则结果为一个浮点值,且不会受到上述规则影响 (关于这一点, DECIMAL 列值被视为浮点值)。
24 mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;
25 -> -1.0
26
若你在一个算术运算中使用了一个字符串,它会被转化为一个浮点数。