在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
不要删除该行吗?
答案 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 + '%'