2009-04-21 5 views
10

現在、正規化されたバージョンの文字列をSQL Serverデータベースに小文字で格納しています。たとえば、私のUsersテーブルには、UserNameフィールドとLoweredUserNameフィールドがあります。コンテキストに応じて、TeredoのLOWER()関数またはC#のString.ToLower()メソッドを使用して、LowereredUserNameフィールドを埋めるためにユーザー名の小文字バージョンを生成します。 Microsoft's guidelinesVisual 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テーブルおよびプロシージャの独自のコードは小文字の正規化を使用していますか?すべてを大文字の正規化に切り替えるか、小文字の正規化を続けるだけですか?

答えて

3

最初の質問に答えるには、はいMicrosoftは少し矛盾しています。 2番目の質問に答えるには、アプリケーションでボトルネックの原因となっていることを確認するまで、何も切り替えないでください。

時間を無駄にするのではなく、プロジェクトにどれだけの進歩があるかを考えてください。あなたの開発時間は、そのような変更から得られる節約よりずっと貴重です。

は覚えておいてください:

早期の最適化が(あるいは少なくともそのほとんど)プログラミングで諸悪の根源です。 - Donald Knuth

+0

これはパフォーマンス上の問題ではなく、グローバリゼーションの問題です。 Microsoftによると、大文字に変換することは安全ですが、小文字に変換すると情報が失われる可能性があります(たとえば、トルコの「私」の問題)。 –

+2

@Kevin、トルコ語/アゼリのドットなしの問題は、小文字はSS(ßまたはß)にはあいまいですが、それは不完全でも(私はİとıをIに大文字にします) SZにはまだ大文字の綴りがあります)。それでもなお良いです。さらに便利なのは、Unicodeの大文字と小文字を区別するルールをiとıのTurkicスイッチで使用することですが、まだ完璧ではありません。それはロケールごとにしかできません:( –

6

CA1308によると、これを行う理由は、いくつかの文字が上から下ケースに変換往復することができないということです。重要なことは、常に一方向に移動することです。標準が常に小文字に移行する場合は、それを変更する理由はありません。

+4

私はこのアプローチが好きです。スタンダードは他には何の動機もないので常にベストプラクティスですが、既存のメンテナンスに取り組んでいるときはそう言い方が変わってしまうのは愚かであることがよくあります。 –

+0

私はまったく同意します、ジェフ、あなたが従うべき指針があります。私はそれに従うために既存のコードをアップグレードする価値があるかもしれないと言います(あなたのデータリーダーを例)これは、それらのルールの1つでも、近くにあるものでもありません。 – JoshBerke

-2

小文字の正規化を続行します。大規模な問題が発生した場合にのみ、Microsoft標準に準拠するように変更してください。

これは残念ですが、価値があります。悲しいことに、マイクロソフトの「標準」は一貫しているとは考えられない傾向があります。彼らとの経験は、説得力のある理由がなければ、それが動作している間に動作するものに留めることが最善であることを示しました。これは一般に、Microsoft以外のテクノロジには当てはまりません。マイクロソフトの「標準」の恣意性が避ける価値があるのです。

編集:ここで明確にする必要があります。マイクロソフトの私の意見は、標準の長い経験から、非常に低いです。コメントに指摘されているように、私は「Microsoft以外のすべての人」について指摘する特別な言及はありません。これは私の個人的な経験から来たものです。あなたのマイルは多岐にわたることがあります。この回答は実際には私の意見と考えるべきです。早くそれをもっと明確にしないと申し訳ありません。

+5

私はあなたが「誰でもMi」の主張をする前にいくつかの情報源を挙げる必要があると思いますcrosoft "と言います。近年、マイクロソフトは標準の背後にある動機を研究することに非常に配慮しているようであり、IEでのWeb標準の実装は理想とはかけ離れていますが、製品内で作業するために定義した標準はしばしば優れています。苦い意見として解釈されないように、あなたの声明をバックアップしてください。 –

+3

私はジェフが同意しています。彼らの基準は非常に一貫していますが、標準の採用はあまりありませんが、これが期待されます。標準に採用される前に書かれたコードは、ネームスペースを選ぶための新しいアプローチと血まみれの殺人を叫ぶすべての開発者を反映するために、ネームスペース。 – JoshBerke

+0

あなたのポイントはどちらも良いです。私の立場は、実際にはかなり苦い意見や、たくさんの愚かな経験から来ています。それを反映するように更新します。 –

関連する問題