问题是这样的:SQL语句:
declare @n float
declare @c char
set @n = 20
set @c = '6565asd'
select 结果为=@n+@c运行后结果为:
结果为
-----------------------------------------------------
26.0(所影响的行数为 1 行)
本来以为会有语法错误,但是没想到却出现这样的结果,今天问了老师也是支支吾吾的,
所以到这里请教一下,这是什么原因呢?
declare @n float
declare @c char
set @n = 20
set @c = '6565asd'
select 结果为=@n+@c运行后结果为:
结果为
-----------------------------------------------------
26.0(所影响的行数为 1 行)
本来以为会有语法错误,但是没想到却出现这样的结果,今天问了老师也是支支吾吾的,
所以到这里请教一下,这是什么原因呢?
declare @c char char --没有指定字符长度,默认情况为1位
所以以下为6,取的第1位..set @c = '6565asd '
问题是这样的: SQL语句:
declare @n float
declare @c char
set @n = 20
set @c = '6565asd '
select 结果为=@n+@c
--------------------------
这里没转换。你把@c变量定义为一个长度的字符,虽然给@c赋值等于'6565asd',但由于@c只能存储一位字符,所以@c为'6'了,
执行select 结果为=@n+@c 时,浮点类型与字符类型相加,会隐式的将字符型变量@c转换为浮点类型,转换后相加。
所以结果为26.0
declare @n float
declare @c char
set @n = 20
set @c = '0565asd ' --
select 结果为=@n+@c
/*
结果为
-----------------------------------------------------
20.0(所影响的行数为 1 行)*/
----只与第一个字母有关:把@c 第1个改为1
declare @n float
declare @c char
set @n = 20
set @c = '1565asd ' --
select 结果为=@n+@c
/*
结果为
-----------------------------------------------------
21.0(所影响的行数为 1 行)
*/
declare @c char
set @n = 20
set @c = '6565asd '
select [datalength(@c)]=datalength(@c),[@c]=@c,[结果为=@n+@c=20+6]=@n+@c
declare @c char
set @n = 20
set @c = '6565asd '
select 结果为=@n+@c
首先@c是char(1),这里我就不说了.上面有人说了.
语句相当于是
select @n+'6'
进行+运算时,是字串相连,还是算术相加.不是看哪个类型操作数在前.
当有一个操作数为数字型时,SQL默认将+处理为算术运算.datetime型数据类似. 用datetime相关的函数处理时,自不多言.
当datetime与字串操作时,SQL也是认为是两个datetime型数据在操作.应该说数据类型在运算时也有优先级的. 数字,日期(可处理为数字),字串
而数字本身,按其精度,又来确定优先度,高清度优先级高.
比如 1.0/2