我目前存儲串的歸一化版本在我的SQL Server數據庫中的小寫。例如,在我的Users表中,我有一個UserName和一個LoweredUserName字段。根據上下文,我使用T-SQL的LOWER()函數或C#的String.ToLower()方法生成用戶名的小寫版本以填充LoweredUserName字段。根據Microsoft's guidelines和Visual Studio's code analysis rule CA1308,我應該使用C#的String.ToUpperInvariant()而不是ToLower()。據微軟稱,這既是一個性能問題,也是一個全球化問題:轉換爲大寫是安全的,而轉換爲小寫可能會導致信息丟失(例如,the Turkish 'I' problem)。正常化隨着String.ToUpperInvariant()
如果我移動到使用ToUpperInvariant字符串正常化,我將不得不改變我的數據庫架構爲好,因爲我的架構是基於Microsoft's ASP.NET Membership框架(參見this related question),其標準化的字符串爲小寫。
不是微軟自打嘴巴,告訴我們在C#中使用大寫正常化,而在會員表和過程它自己的代碼使用小寫正常化?我是否應該將所有內容切換爲大寫規範化,還是繼續使用小寫規範化?
這不僅僅是一個性能問題,它也是一個全球化問題。據微軟稱,轉換爲大寫是安全的,而轉換爲小寫可能會導致信息丟失(例如,在土耳其語'I'問題中)。 – 2009-04-21 17:43:19
@凱文,土耳其/阿塞拜疆無問題的問題仍然是一個特殊情況,無論採用哪種方法(他們大寫我到İ和ı我),雖然小寫是不明確的SS(應該是ss或ß),但這也是不完美的一些正字法仍然是大寫字母ß到SZ)。但它仍然更好。更好的辦法是使用統一字符集的case-folding規則,爲我和ı使用突厥語開關,但它仍然不會很完美,只能是每個語言區域:( – 2010-10-27 23:26:05