You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:54:00