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

SQL Server中nvarchar列全角半角字符查询冲突问题咨询

解决SQL Server中全角/半角拉丁字母查询冲突的问题

这个坑我之前踩过!本质是SQL Server默认的排序规则会把全角和半角的拉丁字母视为等价字符,导致你查询半角Word时,全角版的Word也被匹配出来。

为什么会出现这个问题?

大多数SQL Server默认的排序规则(比如常见的Chinese_PRC_CI_AS)开启了**Width Insensitive(忽略全角半角差异)**的特性,所以在字符比较时,全角的W和半角的W会被判定为相等,这就是你执行SELECT CASE WHEN N'Word' = N'Word' THEN 1 ELSE 0 END;会返回1的原因。

临时解决方案(查询时指定规则)

如果你不想改动表结构,可以在查询语句里临时指定区分全角半角的排序规则,用COLLATE子句就行:

-- 替换成你的表名和列名
SELECT *
FROM YourTable
WHERE NameColumn = N'Word' COLLATE Chinese_PRC_CS_AS_WS;

这里的_WS就是Width Sensitive的缩写,代表区分全角半角;_CS是区分大小写(如果不需要区分大小写,可以换成_CI,比如Chinese_PRC_CI_AS_WS)。

你可以先跑这个验证一下:

SELECT CASE WHEN N'Word' = N'Word' COLLATE Chinese_PRC_CS_AS_WS THEN 1 ELSE 0 END;

结果会返回0,说明现在两个字符串被正确区分开了。

永久解决方案(修改列排序规则)

如果这个表经常需要区分全角半角字符,建议直接修改列的排序规则:

-- 替换成你的表名、列名和合适的长度
ALTER TABLE YourTable
ALTER COLUMN NameColumn NVARCHAR(50) COLLATE Chinese_PRC_CS_AS_WS NOT NULL;

⚠️ 注意:修改列排序规则会锁表,而且要确保现有数据不会因为规则变更出现异常,操作前最好先备份数据。

如果是新建表,直接在定义列时指定带_WS的排序规则就可以避免这个问题啦。

内容的提问来源于stack exchange,提问作者sgtfrankieboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:40:51