Varchar 和 nvarchar 不同地隐式转换为 int



>SQL Server 2017.排序规则:SQL_Latin1_General_CP1_CI_AS

旧数据库。

以下代码:

DECLARE @qav nvarchar(255)
SET @qav = '-89'
SELECT CASE WHEN @qav < '0' THEN 1 ELSE 0 END as char_test
----=====================================
DECLARE @qav1 varchar(255)
SET @qav1 = '-89'
SELECT CASE WHEN @qav1 < '0' THEN 1 ELSE 0 END as char_test

结果不同的结果:

char_test   
----------- 
0           
char_test   
----------- 
1           

谁能解释为什么 nvarchar '-89' <'0' 在使用varcharnvarchar时返回不同的结果?

对于隐式转换,int的优先级高于varcharnvarchar(隐式和显式转换(。
所以在这种情况下:

'-89' < 0

'-89'转换为int,相当于:

-89 < 0

这是TRUE.

字符串和数字是完全不同的。字符串按每个字符从左到右排序,数字按数字顺序排序。这只是使用正确的数据类型如此重要的一个原因。

'10'小于'2',因为'2'大于'1',因此'10'小于'2''09-12-2019'是">之前"'31-01-1924'因为'3'大于'0'

如果要比较数字,请使用数值数据类型,而不是字符串。如果要比较日期(和时间(,请使用"日期和时间"数据类型,而不是字符串。


显示 OP 实际询问的内容 数据类型优先级。当 2 个表达式具有不同的数据类型并进行比较时,数据优先级用于隐式转换表达式的一侧与另一侧相同。

在查询中,您有 2 个表达式:@qav1 < '0'@qav1 < 0。前者不会受到数据类型优先级的影响,因为两端是相同的。结果-与具有较大值的0进行比较,因此返回1

对于第二个第二个表达式,由于数据类型优先级,'-89'被隐式转换为int,因此表达式 beomces-89 < 0。这是真的,所以1返回。

SQL Server 对数据类型使用以下优先顺序:

  1. 用户定义的数据类型(最高(
  2. sql_variant
  3. .xml
  4. 日期时间偏移量
  5. 日期时间2
  6. 日期时间
  7. 小日期时间
  8. 日期
  9. 时间
  10. 真正
  11. 十进制
  12. 小钱
  13. 比金特
  14. 国际
  15. 斯莫林特
  16. 天银
  17. ntext
  18. 发短信
  19. 图像
  20. 时间戳
  21. 唯一标识符
  22. 恩瓦尔
  23. 查尔(包括恩瓦尔查尔(最大( (
  24. 查尔
  25. 瓦尔查尔(
  26. 包括瓦尔查尔(最大( (
  27. varbinary(包括varbinary(max( (
  28. 二进制(最低(

最新更新