用户输入与数据库字符串比较应选择哪种StringComparison类型?
结论
你当前的场景应该选择 StringComparison.Ordinal 作为比较类型。
具体解释
- 首先明确你的核心需求是精确判断两个字符串的Unicode编码是否完全一致:只要数据库存储的字符串和用户输入的字符串在字符编码层面有任何差异,就需要执行更新操作。Ordinal 是直接逐字节比较Unicode编码,执行速度最快,也不会出现因文化规则导致两个编码不同的字符串被误判为相等的问题,完全匹配该场景需求。
- 关于文档中提到的「持久化」例外场景,特指需要存储具有自然语言意义、需要跨文化保持一致的比较/排序规则、又不需要适配特定地区用户习惯的数据的情况。比如存储全球通用的系统分类标签、跨地区统一的日志分级标识等,这类数据需要在不同语言的运行环境中保持一致的语义比较、排序结果,同时要符合人类对自然语言的通用认知(比如重音字符、大小写的通用等价规则),这种时候才需要用到InvariantCulture。
- 你的场景并不符合上述例外:你要做的不是「自然语言语义等价判断」,而是「存储内容的精确一致性判断」。比如用户输入
cafe和数据库中存储的café,哪怕两者语义指向同一个含义,只要字符编码不同就属于内容变更,需要更新数据库,这种需求下用Ordinal是最稳妥的选择。
常见误区提醒
如果误用CurrentCulture或InvariantCulture做该场景的比较,可能会出现意料之外的bug:比如部分文化规则会将全角半角字符、大小写字符、带/不带重音的字符判定为相等,导致明明用户修改了内容,却被判定为无变更,跳过数据库更新。
内容的提问来源于stack exchange,提问作者B.O.B.
相关产品推荐
相关产品推荐

