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

向带唯一非聚集索引的nvarchar字段插入货币符号遇重复键问题求助

问题:唯一非聚集索引下卢布与坚戈符号被判定重复的解决方法

你在向带有**UNQ NONCLUSTERED INDEX(唯一非聚集索引)**约束的nvarchar字段插入货币符号时遇到问题:卢布符号₽和坚戈符号₸被判定为重复值。

执行以下T-SQL查询:

select [utg]=unicode('₸'), [urb]=unicode('₽'),[ntg]=nchar(8376),[nrub]=nchar(8381)

得到的输出结果:

utgurbntgnrub
6363₸₽

当尝试在已有₽记录的dbo.glossary表中插入₸时,SQL返回错误:

Cannot insert duplicate key row in object 'dbo.glossary' with unique index 'IX_glossary_word'. The duplicate key value is (₽).
The statement has been terminated.


核心原因

问题出在字符串常量未使用Unicode前缀,导致SQL Server将这些特殊符号识别为问号(Unicode编码63),两个符号因此被判定为相同值。

解决步骤

  1. 插入/查询时添加N前缀
    所有包含Unicode特殊字符的字符串常量前必须加N前缀,明确告知SQL Server这是Unicode字符串。正确的插入语句示例:

    INSERT INTO dbo.glossary (word) VALUES (N'₸');
    

    重新执行查询并添加N前缀,即可得到正确的Unicode编码:

    select [utg]=unicode(N'₸'), [urb]=unicode(N'₽'),[ntg]=nchar(8376),[nrub]=nchar(8381)
    

    此时utg会返回8376,urb返回8381,两个符号会被正确识别为不同值。

  2. 确认字段类型为nvarchar
    确保目标字段确实是nvarchar类型(而非varchar),varchar不支持完整Unicode字符集,会导致特殊字符丢失或被转换。

  3. 检查索引排序规则
    若上述操作后仍有问题,检查唯一索引的排序规则是否支持区分Unicode补充字符。可指定包含补充字符支持的排序规则,示例创建语句:

    CREATE UNIQUE NONCLUSTERED INDEX IX_glossary_word 
    ON dbo.glossary (word COLLATE Latin1_General_100_CS_AS_SC);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:30:49