Sql 包含整数的varchar如何在计算中工作
为什么字符串可以包含整数。即使我假设字符串将数字值存储为字符串,但即使我也可以使用它进行计算并得到结果。只是想试试,我用倒逗号写了5,但计算结果仍然很好。不知道怎么做Sql 包含整数的varchar如何在计算中工作,sql,sql-server,Sql,Sql Server,为什么字符串可以包含整数。即使我假设字符串将数字值存储为字符串,但即使我也可以使用它进行计算并得到结果。只是想试试,我用倒逗号写了5,但计算结果仍然很好。不知道怎么做 declare @x varchar(20) declare @y int select @x='5' select @y=6 select @x+@y varchar可以包含您正在使用的排序规则代码页中的任何字符。为了回答这个问题,我假设您使用的是排序规则SQL\u Latin1\u General\u CP1\u CI\u
declare @x varchar(20)
declare @y int
select @x='5'
select @y=6
select @x+@y
varchar
可以包含您正在使用的排序规则代码页中的任何字符。为了回答这个问题,我假设您使用的是排序规则SQL\u Latin1\u General\u CP1\u CI\u AS
(没有任何“国际”字符,如汉字、平假名等)
首先将变量@x
声明为varchar(20)
,并将varchar
值'5'
放入其中。这不是一个int
,而是一个varchar
。这是一个重要的区别,因为varchar
和数字数据类型(如int
)的行为非常不同。例如,'10'
的值低于'2'
,而10
和2
的值正好相反。(这就是为什么使用正确的数据类型总是很重要的原因之一。)
第二个变量是@y
,它是一个int
,值为6
然后你有你的表达式选择@x+@y代码>。这有两个部分。首先,由于您有两种数据类型,因此开始发挥作用int
的优先级高于varchar
,因此@x
被隐式转换为int
。然后计算表达式,将+
用作加法运算符(而不是串联运算符)。因此,表达式的有效推导方式如下:
@x + @y = '5' + 6 = CONVERT(int,'5') + 6 = 5 + 6 = 11
SQL Server对数据类型使用以下优先顺序:
用户定义的数据类型(最高)
sql_变体
xml
日期时间偏移
日期时间2
日期时间
smalldatetime
日期
时间
浮动
真实的
十进制
钱
小额钱
比基特
int
斯莫林
锡
钻头
内文
正文
形象
时间戳
唯一标识符
nvarchar(包括nvarchar(最大))
恩查尔
varchar(包括varchar(最大))
煤焦
varbinary(包括varbinary(最大))
二进制(最低)
varchar
可以包含您正在使用的排序规则代码页中的任何字符。为了回答这个问题,我假设您使用的是排序规则SQL\u Latin1\u General\u CP1\u CI\u AS
(没有任何“国际”字符,如汉字、平假名等)
首先将变量@x
声明为varchar(20)
,并将varchar
值'5'
放入其中。这不是一个int
,而是一个varchar
。这是一个重要的区别,因为varchar
和数字数据类型(如int
)的行为非常不同。例如,'10'
的值低于'2'
,而10
和2
的值正好相反。(这就是为什么使用正确的数据类型总是很重要的原因之一。)
第二个变量是@y
,它是一个int
,值为6
然后你有你的表达式选择@x+@y代码>。这有两个部分。首先,由于您有两种数据类型,因此开始发挥作用int
的优先级高于varchar
,因此@x
被隐式转换为int
。然后计算表达式,将+
用作加法运算符(而不是串联运算符)。因此,表达式的有效推导方式如下:
@x + @y = '5' + 6 = CONVERT(int,'5') + 6 = 5 + 6 = 11
SQL Server对数据类型使用以下优先顺序:
用户定义的数据类型(最高)
sql_变体
xml
日期时间偏移
日期时间2
日期时间
smalldatetime
日期
时间
浮动
真实的
十进制
钱
小额钱
比基特
int
斯莫林
锡
钻头
内文
正文
形象
时间戳
唯一标识符
nvarchar(包括nvarchar(最大))
恩查尔
varchar(包括varchar(最大))
煤焦
varbinary(包括varbinary(最大))
二进制(最低)
SQL Server——以及所有其他数据库——在需要时在类型之间转换值
在本例中,您有+
,它可以是字符串串联或数字相加。因为一个参数是整数,所以它被解释为加法,SQLServer尝试将字符串转换为数字
如果无法转换字符串,则会出现错误
我建议您尽最大努力避免此类隐式转换。定义值时使用正确的类型。如果需要在字符串中存储其他类型,请使用cast()
/convert()
。或者更好的方法是,试试cast()
/试试convert()
:
SQL Server——以及所有其他数据库——在需要时在类型之间转换值
在本例中,您有+
,它可以是字符串串联或数字相加。因为一个参数是整数,所以它被解释为加法,SQLServer尝试将字符串转换为数字
如果无法转换字符串,则会出现错误
我会建议你的