現在、正規化されたバージョンの文字列をSQL Serverデータベースに小文字で格納しています。たとえば、私のUsersテーブルには、UserNameフィールドとLoweredUserNameフィールドがあります。コンテキストに応じて、TeredoのLOWER()関数またはC#のString.ToLower()メソッドを使用して、LowereredUserNameフィールドを埋めるためにユーザー名の小文字バージョンを生成します。 Microsoft's guidelinesとVisual Studio's code analysis rule CA1308によれば、ToLower()の代わりにC#のString.ToUpperInvariant()を使用する必要があります。マイクロソフトによると、これはパフォーマンスとグローバリゼーションの両方の問題です。大文字に変換することは安全ですが、小文字に変換すると情報が失われる可能性があります(たとえば、the Turkish 'I' problem)。String.ToUpperInvariant()を使用した文字列の正規化
ToUpperInvariantを文字列正規化に使用すると、スキーマがMicrosoft's ASP.NET Membershipフレームワーク(this related question参照)に基づいているため、文字列を小文字に正規化するため、データベーススキーマも変更する必要があります。
マイクロソフトでは、C#で大文字の正規化を使用するように忠告していますが、Membershipテーブルおよびプロシージャの独自のコードは小文字の正規化を使用していますか?すべてを大文字の正規化に切り替えるか、小文字の正規化を続けるだけですか?
これはパフォーマンス上の問題ではなく、グローバリゼーションの問題です。 Microsoftによると、大文字に変換することは安全ですが、小文字に変換すると情報が失われる可能性があります(たとえば、トルコの「私」の問題)。 –
@Kevin、トルコ語/アゼリのドットなしの問題は、小文字はSS(ßまたはß)にはあいまいですが、それは不完全でも(私はİとıをIに大文字にします) SZにはまだ大文字の綴りがあります)。それでもなお良いです。さらに便利なのは、Unicodeの大文字と小文字を区別するルールをiとıのTurkicスイッチで使用することですが、まだ完璧ではありません。それはロケールごとにしかできません:( –