wikis/stackoverflow/etc は何をしますか。テキストの保存に関してはどうしますか?テキストは改行で壊れていますか? 固定長のチャンクに分割されていますか? 任意に長いテキストのチャンクを保存するにはどうすればよいでしょうか?
8 に答える
nvarchar(max) フィート。単純なことを過度に複雑にするのはよくないからです。
テキストの大きなチャンクを格納する機能を提供する必要があり、クエリを実行するときにコンテンツをあまり調べなくてもかまわない場合は、CLobsを使用できます。
これはすべて、使用しているRDBMSと、保存するテキストの種類によって異なります。テキストが、ヘッダー/本文など、それ自体が何かを意味するかなりの量のデータのチャンクにフォーマットされている場合は、データをこれらのタイプの列に分割することをお勧めします。扱っているコンテンツによっては、この方法を使用するために複数のテーブルが必要になる場合があります。
他のRDBMSがそれをどのように処理するかはわかりませんが、各テーブル(textまたはvarchar(max))に複数のオープンエンド列を含めることはお勧めできません。したがって、1つの列だけに無制限の文字が含まれていることを確認する必要があります。
コードのように、文字列、引用符、その他の「くだらない」の書式設定などをテキストに保持する必要がある場合は、最初に特殊文字を完全にエスケープする必要があります。そうしないと、データベースを送信すると、最終的には終了する可能性があります。無効なコマンドが発行されます。
ほとんどのスクリプト言語には、これをネイティブに実行するためのツールが組み込まれています。
StackOverflowが任意のサイズの「テキスト」列にマークダウン形式でテキストを保存しているのではないかと思います。たぶんUTF8として(しかしそれはUTF16か何かかもしれません。私はそれがSQL Serverだと思いますが、私はあまり知りません)。
原則として、データベースには可能な限り「最悪の」形式でデータを保存する必要があります。つまり、すべてのデコードを行い、場合によってはクリーニングを行いますが、それ以外は何もしません(たとえば、Markdownの場合は、HTMLにエンコードせず、元の「raw」形式のままにします)。
トランザクションなどが必要な場合は、テキストを保存する場所に依存すると思います。
SQL Server などのデータベースには、長いテキスト フィールドを格納できるタイプがあります。SQL Server 2005 では、長い Unicode テキスト文字列の場合、これは主に nvarchar(max) になります。データベースを使用すると、StackOverflow.com のように他の目的でデータベースを使用していると仮定して、トランザクションと簡単なバックアップ/復元の恩恵を受けることができます。
もう 1 つの方法は、ディスク上のファイルにテキストを格納することです。これは、実装が非常に簡単で、データベースが利用できない環境や過剰な環境で機能する可能性があります。
データベースまたはファイルに保存されているテキストの形式に関しては、おそらく入力に非常に近いものです。HTML の場合は、正しくエスケープする関数を介してプッシュするだけです。
覚えておくべきことは、おそらく、作成から保存まで、およびその逆に、Unicode または UTF-8 を使用したいということです。これにより、追加の言語をサポートできます。このエンコーディング メカニズムに問題があると、テキストが破損します。歴史的に、人々は、ディスク容量を節約するなどの仮定に基づいて、デフォルトで ASCII を使用していた可能性があります。
SQL サーバーの場合:
varchar(max) を使用して格納します。上限は2GBだと思います。
テキストを自分でエスケープしようとしないでください。適切にエスケープを行うパラメータ化構造を介してテキストを渡します。.Net では、パラメータを SqlCommand に追加するか、LinqToSQL を使用します (SqlCommand を管理します)。