像nvarchar一样工作不正常?

时间:2015-11-13 14:00:02

标签: tsql sql-server-2012

在Windows NT 6.1(Build 7601:Service Pack 1)上使用Microsoft SQL Server 2012 - 11.0.5058.0(X64)Express Edition(64位)(管理程序)

使用该创建/填充脚本:

CREATE TABLE tbl (col CHAR (32) )
insert into tbl values ('test')

这些陈述:

declare @var varchar(32) = 'test'
delete from tbl where col like @var

delete from tbl where col like 'test'

实际上删除了这一行,但为什么会这样:

declare @nvar nvarchar(32) = 'test'
delete from tbl where col like @nvar

不要删除该行吗?

1 个答案:

答案 0 :(得分:4)

根据此页面... https://msdn.microsoft.com/en-us/library/ms179859.aspx

  

当您使用LIKE的Unicode数据(nchar或nvarchar数据类型)时,   尾随空白是重要的;

由于您使用长度为32的CHAR数据类型,因此存储的实际数据为" test" +28个空格。

在您的比较中,您正在混合CHAR和nvarchar。由于数据类型不同,SQL Server会将CHAR数据类型转换为NCHAR以执行比较。

如果将列的数据类型更改为VARCHAR,则代码可以正常工作。您还可以将代码更改为:

delete from tbl where col like @nvar + '%'