向带唯一非聚集索引的nvarchar字段插入货币符号遇重复键问题求助
你在向带有**UNQ NONCLUSTERED INDEX(唯一非聚集索引)**约束的nvarchar字段插入货币符号时遇到问题:卢布符号₽和坚戈符号₸被判定为重复值。
执行以下T-SQL查询:
select [utg]=unicode('₸'), [urb]=unicode('₽'),[ntg]=nchar(8376),[nrub]=nchar(8381)
得到的输出结果:
| utg | urb | ntg | nrub |
|---|---|---|---|
| 63 | 63 | ₸ | ₽ |
当尝试在已有₽记录的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),两个符号因此被判定为相同值。
解决步骤
插入/查询时添加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,两个符号会被正确识别为不同值。确认字段类型为nvarchar
确保目标字段确实是nvarchar类型(而非varchar),varchar不支持完整Unicode字符集,会导致特殊字符丢失或被转换。检查索引排序规则
若上述操作后仍有问题,检查唯一索引的排序规则是否支持区分Unicode补充字符。可指定包含补充字符支持的排序规则,示例创建语句:CREATE UNIQUE NONCLUSTERED INDEX IX_glossary_word ON dbo.glossary (word COLLATE Latin1_General_100_CS_AS_SC);
内容的提问来源于stack exchange,提问作者BigDen

