WT_*_*T_W 15 sql-server sql-server-2012
我今天在 SQL Server 上遇到了一些有趣的行为(在 2005 年和 2012 年观察到),我希望有人能解释一下。
使用=NVARCHAR 字段进行比较的查询会忽略字符串中的尾随空格(或在比较之前自动修剪值),但使用like运算符的同一查询不会忽略该空格。2012 年使用的排序规则是 Latin1_General_CI_AS。
考虑这个 SQL 小提琴:http ://sqlfiddle.com/#! 6/72262/4
请注意,like运算符不会返回尾随空格字符串的结果,但=运算符会返回。为什么是这样?
加分项:我无法在 VARCHAR 字段上复制它,我原以为在两种数据类型中都会以相同的方式处理空间 - 这是真的吗?
小智 18
我最初的回答表明 ANSI_PADDING 标志设置为 OFF 可能是行为差异的罪魁祸首。然而,这是不正确的;这个标志只对存储有影响,但对相等比较没有影响。
差异源于Microsoft 对 SQL 标准的实现。该标准规定,在检查相等性时,相等运算符左侧和右侧的字符串都必须填充以具有相同的长度。这解释了以下结果:
insert into test_padding (varchar_clmn, nvarchar_clmn) values ('space ', 'nspace ')
go
-- equality for varchar column
select count(*) from test_padding where varchar_clmn = 'space' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space ' --returns 1
-- equality for nvarchar column
select count(*) from test_padding where nvarchar_clmn = 'nspace' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace ' --returns 1
Run Code Online (Sandbox Code Playgroud)
LIKE 运算符不填充其操作数。对于VARCHAR和NVARCHAR列类型,它的行为也不同:
-- likeness for varchar column
select count(*) from test_padding where varchar_clmn like 'space' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space ' -- returns 0
-- likeness for nvarchar column
select count(*) from test_padding where nvarchar_clmn like 'nspace' -- returns 0
select count(*) from test_padding where nvarchar_clmn like 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn like 'nspace ' -- returns 0
Run Code Online (Sandbox Code Playgroud)
ASCII 类型的 LIKE 运算符的行为是特定于 SQL Server 的;对于 Unicode 类型,它符合 ANSI。
SQL 诞生于大多数数据处理语言对每个字段/变量使用固定长度的时代。使用额外空格自动填充文本字段也是该图片的一部分。为了与该行为保持一致,原始 SQL CHAR 类型已显式定义其“=”运算符以忽略尾随空格。(如果您觉得奇怪,请向我展示一个令人信服的案例,其中附加到文本的尾随空格具有实际的商业意义。)
从那时起,SQL CHAR 类型已向各个方向发展,但某些更现代的数据类型仍然继承了其历史前身的一些特征,这并非不可想象。
| 归档时间: |
|
| 查看次数: |
18258 次 |
| 最近记录: |