我目前在我的 SQL Server 数据库中以小写形式存储规范化版本的字符串。例如,在我的 Users 表中,我有一个 UserName 和一个 LoweredUserName 字段。根据上下文,我使用 T-SQL 的 LOWER() 函数或 C# 的 String.ToLower() 方法来生成用户名的小写版本以填充 LoweredUserName 字段。根据Microsoft 的指导方针和Visual Studio 的代码分析规则 CA1308,我应该使用 C# 的 String.ToUpperInvariant() 而不是 ToLower()。根据微软的说法,这既是性能问题,也是全球化问题:转换为大写字母是安全的,而转换为小写字母会导致信息丢失(例如,土耳其语的“I”问题)。
如果我转而使用 ToUpperInvariant 进行字符串规范化,我也将不得不更改我的数据库架构,因为我的架构基于Microsoft 的 ASP.NET Membership框架(请参阅此相关问题),它将字符串规范化为小写。
微软告诉我们在 C# 中使用大写规范化,而它自己的 Membership 表和过程中的代码使用小写规范化,这不是自相矛盾吗?我应该将所有内容都切换为大写规范化,还是继续使用小写规范化?