今天学生问了一个问题,为什么对int类型的字段,插入varchar也行,突然想到SQL中也有数据类型转换一说,上网找了些资料,原来也是以前用过的,只是早已经遗忘了。
数据类型转换
在 Transact-SQL 中,可能有两个级别的数据类型转换:
- 当一个对象的数据移动到另一个对象,或两个对象之间的数据进行比较或组合时,数据可能不得不从一个对象的数据类型转换为另一个对象的数据类型。
- 当将来自 Transact-SQL 结果列、返回代码或输出参数的数据移动到程序变量中时,必须将这些数据从 Microsoft® SQL Server™ 数据类型转换成该变量的数据类型。
数据类型转换有两种:
- 隐性转换对于用户是不可见的。 SQL Server 自动将数据从一种数据类型转换成另一种数据类型。例如,如果一个 smallint 变量和一个 int 变量相比较,这个 smallint 变量在比较前即被隐性转换成 int 变量。
- 显式转换使用 CAST 或 CONVERT 函数。
CAST 和 CONVERT 函数将数值从一个数据类型(局部变量、列或其它表达式)转换到另一个数据类型。例如,下面的 CAST 函数将数值 $157.27 转换成字符串 '$157.27':
CAST ( $157.27 AS VARCHAR(10) )
CAST 函数基于 SQL-92 标准并且优先于 CONVERT。
转换小数位数不同的数据类型时,结果值有时被截断,有时被舍入。
被转换的数据类型 | 转换为的数据类型 | 行为 |
---|---|---|
numeric |
numeric |
Round |
numeric |
int |
截断 |
numeric |
money |
Round |
money |
int |
Round |
money |
numeric |
Round |
float |
int |
截断 |
float |
numeric |
Round |
float |
datetime |
Round |
datetime |
int |
舍入 |
例如,以下转换的结果为 10
:
SELECT CAST(10.6496 AS int)
在进行数据类型转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则该值将被截断。例如,以下转换的结果为 $10.3497
:
SELECT CAST(10.3496847 AS money)
当非数字型 char、nchar、varchar 或 nvarchar 数据转换为 int、float、numeric 或 decimal 时,SQL Server 将返回错误消息。当空字符串 (" ") 转换为 numeric 或 decimal 时,SQL Server 也返回错误。
当从一个 SQL Server 对象的数据类型向另一个转换时,一些隐性和显式数据类型转换是不支持的。例如,nchar 数值根本就不能被转换成 image 数值。nchar 只能显式地转换成 binary,隐性地转换到 binary 是不支持的。nchar 可以显式地或者隐性地转换成 nvarchar。
当处理 sql_variant 数据类型时,SQL Server 支持将具有其它数据类型的对象隐性转换成 sql_variant 类型。然而,SQL Server 并不支持从 sql_variant 数据隐性地转换到其它数据类型的对象。
在应用程序变量和 SQL Server 结果集列、返回代码、参数或参数标记之间转换时,所支持的数据类型转换是由数据库应用程序接口定义。