>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' 在使用varchar
和nvarchar
时返回不同的结果?
对于隐式转换,int
的优先级高于varchar
和nvarchar
(隐式和显式转换(。
所以在这种情况下:
'-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 对数据类型使用以下优先顺序:
- 用户定义的数据类型(最高(
- sql_variant
- .xml
- 日期时间偏移量
- 日期时间2
- 日期时间
- 小日期时间
- 日期
- 时间
- 浮
- 真正
- 十进制
- 钱
- 小钱
- 比金特
- 国际
- 斯莫林特
- 天银
- 位
- ntext
- 发短信
- 图像
- 时间戳
- 唯一标识符
恩瓦尔- 查尔(包括恩瓦尔查尔(最大( (
- 查尔
瓦尔查尔(- 包括瓦尔查尔(最大( (
- 煳
- varbinary(包括varbinary(max( (
- 二进制(最低(