SQL Server中nvarchar列LIKE运算符、N前缀和%通配符失效问题求解
解决SQL Server中nvarchar列LIKE带变量+%通配符失效的问题
我帮你分析下问题所在,以及对应的解决办法:
首先,你的核心问题出在Unicode字符串的处理一致性上,不管是单独的查询还是存储过程,都需要保证整个字符串处理链路都是Unicode兼容的:
1. 修正单独查询的写法
你现在给变量@t赋值时没有加N前缀,这会导致原本的Unicode字符(阿拉伯语的"حس")被转成非Unicode编码存储,哪怕变量是nvarchar类型也已经丢失了正确的字符信息。正确的写法应该是:
declare @t nvarchar(20) set @t = N'حس' -- 赋值时必须加N前缀,确保字符串以Unicode格式存储 SELECT [perno] ,[pName] FROM [dbo].[People] Where [pName] like @t + N'%'
这里不需要用N''+@t,直接给变量赋值时加N,然后拼接的%也要用N'%',保证拼接后的整个匹配串是Unicode类型。
2. 修正存储过程的写法
存储过程的参数已经是nvarchar类型,但拼接通配符的时候要确保通配符是Unicode的,而且调用存储过程时传入参数必须加N前缀,否则参数会被转成非Unicode字符传入。修改后的存储过程:
ALTER PROCEDURE [dbo].[aTest] (@t nvarchar(20)) AS BEGIN SELECT [perno] ,[pName] FROM [dbo].[People] WHERE [pName] LIKE @t + N'%' -- 直接拼接N'%',无需多余的N'' END
调用存储过程的正确方式:
EXEC [dbo].[aTest] @t = N'حس' -- 传入参数必须加N前缀
3. 额外需要确认的点
- 确保
[pName]列的类型是nvarchar或nchar,如果是varchar/char类型,即使查询语句正确,非Unicode列也无法正确存储和匹配这类特殊字符。 - 检查数据库的排序规则,确保使用的是支持Unicode字符的排序规则(比如
Arabic_CI_AS这类针对阿拉伯语的排序规则,或者通用的SQL_Latin1_General_CP1_CI_AS也支持Unicode,但针对特定语言的排序规则匹配更准确)。
内容的提问来源于stack exchange,提问作者jaleel
相关产品推荐
相关产品推荐

