SQL Server 2019 varchar字段保存拉丁字符异常问题求助
替代解决方案(无需大量修改nvarchar字段)
1. 插入/更新前规范化字符串
把组合形式的字符(比如~+a)转换为预组合字符(ã),可以从两个层面处理:
- 客户端处理:在数据提交到数据库前,用字符串规范化函数将文本转为NFC(预组合形式)。比如C#里用
String.Normalize(NormalizationForm.FormC),Python用unicodedata.normalize('NFC', text)。 - 数据库层处理:如果没法改客户端逻辑,插入或更新时调用SQL Server的
NORMALIZE函数转换字符串,示例:
也可以创建触发器自动处理,不用每次写SQL都手动调用函数:INSERT INTO YourTable (YourVarcharColumn) VALUES (NORMALIZE('n~ao', N'NFC'));CREATE TRIGGER Trg_NormalizeVarcharColumn ON YourTable INSTEAD OF INSERT, UPDATE AS BEGIN INSERT INTO YourTable (YourVarcharColumn) SELECT NORMALIZE(YourVarcharColumn, N'NFC') FROM inserted; END;
2. 修改字段排序规则为支持组合字符的非Unicode规则
部分SQL Server排序规则能自动把组合字符映射到预组合字符,比如Latin_General_100_CI_AS_SC(SC代表支持补充字符映射)。修改排序规则不需要改动字段类型(仍用varchar),示例:
ALTER TABLE YourTable ALTER COLUMN YourVarcharColumn VARCHAR(255) COLLATE Latin_General_100_CI_AS_SC;
注意:修改排序规则会锁表,建议在业务低峰操作;同时要测试现有数据的排序、查询行为是否符合预期。
3. 客户端输入控件预处理
如果问题集中在用户复制粘贴场景,可以在输入控件里监听粘贴事件,把粘贴的文本先转成NFC格式再插入输入框,从源头避免组合字符进入数据库。
内容的提问来源于stack exchange,提问作者Josy Sclei
相关产品推荐
相关产品推荐

