2009-04-21 48 views
10

我目前存儲串的歸一化版本在我的SQL Server數據庫中的小寫。例如,在我的Users表中,我有一個UserName和一個LoweredUserName字段。根據上下文,我使用T-SQL的LOWER()函數或C#的String.ToLower()方法生成用戶名的小寫版本以填充LoweredUserName字段。根據Microsoft's guidelinesVisual 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#中使用大寫正常化,而在會員表和過程它自己的代碼使用小寫正常化?我是否應該將所有內容切換爲大寫規範化,還是繼續使用小寫規範化?

回答

3

要回答你的第一個問題,是微軟是有點不一致。要回答第二個問題,除非確認這會導致應用程序瓶頸,否則不要切換任何內容。

想想多少,你可以向前進步做出你的項目上浪費時間切換的一切,而不是。你的開發時間比你從這種改變中獲得的節省更有價值。

記住:

過早的優化是所有罪惡的根源(或至少大部分)在編程。 - Donald Knuth

+0

這不僅僅是一個性能問題,它也是一個全球化問題。據微軟稱,轉換爲大寫是安全的,而轉換爲小寫可能會導致信息丟失(例如,在土耳其語'I'問題中)。 – 2009-04-21 17:43:19

+2

@凱文,土耳其/阿塞拜疆無問題的問題仍然是一個特殊情況,無論採用哪種方法(他們大寫我到İ和ı我),雖然小寫是不明確的SS(應該是ss或ß),但這也是不完美的一些正字法仍然是大寫字母ß到SZ)。但它仍然更好。更好的辦法是使用統一字符集的case-folding規則,爲我和ı使用突厥語開關,但它仍然不會很完美,只能是每個語言區域:( – 2010-10-27 23:26:05

6

根據CA1308,要做到這一點的原因是,一些字符不能被轉換的往返從上部爲小寫。重要的是你總是朝着一個方向移動,所以如果你的標準總是轉向小寫,那麼沒有理由去改變它。

+4

我喜歡這種方法。如果從頭開始,遵循推薦的標準永遠是最好的實踐,因爲除此之外別無其他動機,但在開展現有維護工作時,通常是愚蠢的,因爲它是這樣說的。您需要令人信服的證據表明您的項目將在開始實施之前從變更中受益一個徹底改變 - 也許當你開始處理土耳其語,並遇到問題嗎? – 2009-04-21 17:50:48

-2

繼續使用小寫標準化。如果出現大問題,只能根據Microsoft標準進行更改。

這是不幸的,但值得。可悲的是,微軟的「標準」往往考慮得不好,並且不太一致;與他們的經驗表明,除非有令人信服的理由,否則最好只是堅持它在工作時的作用。請注意,非微軟技術通常不會這樣;但微軟「標準」的任意性使得它們值得避免。

編輯:我要澄清這裏;我對微軟的看法很低,從他們的標準的長期經驗。正如評論中指出的那樣,我沒有特別提及要指出「除微軟以外的其他人」;這只是來自我個人的經歷。您的里程可能會有所不同。這個答案應該只是我的看法。對不起,以前沒有更清楚。