JSON文字列を格納するのに最適なSQLデータ型は何ですか?


127

JSON文字列を格納するのに最適なSQLデータ型は何ですか?

static List<ProductModel> CreateProductList()
{
    string json = @"[
        {
            ProductId: 1, 
            ProductCode: 'A', 
            Product: 'A'
        },
        {
            ProductId: 2, 
            ProductCode: 'B', 
            Product: 'B'
        }
    ]";

    IList<JToken> tokenList = JToken.Parse(json).ToList();
    List<ProductModel> productList = new List<ProductModel>();

    foreach (JToken token in tokenList)
    {
        productList.Add(JsonConvert.DeserializeObject<ProductModel>(token.ToString()));
    }

    return productList;
}

JSONを含む文字列を格納するためにどのSQLデータ型を使用する必要がありますか?

  • NVARCHAR(255)
  • TEXT
  • VARBINARY(MAX)

1
単なるランダムノイズ(データではなくコメント):圧縮することもできます。その場合、バイナリが必要です。一方、データに適したテーブルを設計するだけではどうですか。
ネイル

3
@The Nail:必要に応じて、JSON(または「ドキュメント」)として何かを保存することが適切な場合があります。ワークフローエンジンやドキュメント管理などのように、現在のプロジェクトでこれを行っています。実際には、CQRS実装のコマンド側のリレーショナルからドキュメントへのアプローチに進んでいます。ServiceStackやJSON.Netなどのシリアライザーを使用すると、非常に高速になります。
スワニー、2012年

回答:


198

確かにありません

  • TEXT, NTEXT:これらのタイプはSQL Server 2005で非推奨になり、新規開発には使用しないでください。使用VARCHAR(MAX)またはNVARCHAR(MAX)代わりに、

  • IMAGEVARBINARY(MAX)IMAGEはと同様TEXT/NTEXTに非推奨であり、テキスト列をバイナリ列に格納しても意味がありません...

そのため、基本的にはVARCHAR(x)NVARCHAR(x)次のようになります:VARCHAR非Unicode文字列(文字ごとに1バイト)をNVARCHAR保存し、すべてを文字ごとに2バイトのUnicodeモードで保存します。Unicodeが必要ですか?文字列にアラビア語、ヘブライ語、中国語、またはその他の西ヨーロッパ以外の文字が含まれている可能性はありますか?次に一緒に行きますNVARCHAR

(N)VARCHARカラムは2種類があります:どちらかが8000バイト以下(での結果というの最大長を定義VARCHAR最大8000の文字、NVARCHARそれが十分ではない場合、最大4000まで)は、または、使用し(N)VARCHAR(MAX)たデータの2ギガバイトまで保存バージョンを、。

更新: SQL Server 2016にはネイティブJSONサポートが含まれます-新しいJSONデータ型(に基づくnvarchar)とFOR JSON、クエリからの出力をJSON形式に変換するコマンドが導入されます

アップデート#2:最終製品では、Microsoftは個別のJSONデータ型を含めませんでした-代わりに、タイプの列を操作する(データベース行をJSONにパッケージ化する、またはJSONをリレーショナルデータに解析する)JSON関数がいくつかありますNVARCHAR(n)


25
NVARCHARは、SQL Serverの2016年にはそのネイティブJSONサポートのためにそれを使用するとして好ましい選択肢でなければなりませんblogs.msdn.com/b/jocapc/archive/2015/05/16/...
Loudenvier

@marc_s「更新」ステートメントは正しいですか?公式のJSONデータ型が見つかりません...?
ニックス

2
@Nix:結局のところ、SQL Serverはデータ型を操作するJSON関数をサポートしていますNVARCHAR(n)
marc_s

2
答えを更新して、Jsonデータ型があることを示さないようにすることができます
Nix

1
varbinary(max)は、圧縮を使用するときに使用できます
Marat Gallyamov

31

私は行くつもりですnvarchar(max)。それは要件を満たすはずです。

更新: SQL Server 2016とAzure SQLでは、多くの追加のネイティブJSON機能があります。これは、設計またはアプローチにプラスの影響を与える可能性があります。詳しくは、https//docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-serverをご覧ください。


8
文字ごとに2バイトのUnicodeストレージが本当に必要です?...必要に応じてそれだけで多くのバイトとして二回無駄にされる可能性があります-あなたのデータに応じて(ただし、場合DO Unicodeを必要とする-そしてそれは行くための唯一の方法だ、私は同意する!)
marc_s

5
nvarchar-データが定義されていないため。システムにユニコードが必要ないと思われる場合は、varchar(max)への移行を節約できます
Kangkan

5
また、を使用すると、を使用するnvarcharときに最終的に発生する照合の問題は回避さvarcharれますが、クエリのパフォーマンスはよりも遅くなりますvarchar。詳細についてはDBAの質問です。
Scotty.NET 2013

5
この質問はどのようにして多くの賛成票を得ましたか?したがって、使用するデータ型を示していますが、それが正しい選択である理由を説明しようとはしていません。
stakx-2015年

1
常にvarcharを使用して、任意のUnicode文字をエスケープできます。これは、nvarcharを使用するよりもスペースを節約できるため、テキストにユニコード文字が時々しか含まれない場合に適したアプローチです
chrisb

3

nvarchar(max)SQL 2016またはAzure SQLでJSON機能を使用する場合に使用することをお勧めします。

これらの機能を使用する予定がない場合は、(および)関数とvarbinary(max)組み合わせて使用できます。詳細:https : //blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/COMPRESSDECOMPRESS

COMPRESS関数とDECOMPRESS関数は、標準のGZip圧縮を使用します。クライアントがGZip圧縮を処理できる場合(gzipコンテンツを理解するブラウザなど)、圧縮されたコンテンツを直接返すことができます。これはパフォーマンスとストレージのトレードオフであることに注意してください。圧縮されたデータを頻繁にクエリする場合、テキストを毎回解凍する必要があるため、移行するとパフォーマンスが低下します。


であるJSON SQL 2016に備えて
Kiquenet 2018年


0

これにはnvarchar(max)の方が適しています。

public class TableName
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
     
    public string FieldJson { get; set; }   //save json in this field and
      
    [NotMapped]
    public List<FieldList> FieldList  // get return list from this properity
    {
        get => !string.IsNullOrEmpty(FieldJson) ? JsonConvert.DeserializeObject<List<FieldList>>(FieldJson) : null; 
    }

   
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.