Sql 包含整数的varchar如何在计算中工作

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

为什么字符串可以包含整数。即使我假设字符串将数字值存储为字符串,但即使我也可以使用它进行计算并得到结果。只是想试试,我用倒逗号写了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 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尝试将字符串转换为数字

    如果无法转换字符串,则会出现错误

    我会建议你的