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
相关产品推荐
相关产品推荐

