web-dev-qa-db-ja.com

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

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)
118
DatPT

確かにNOT

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

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

つまり、基本的にVARCHAR(x)またはNVARCHAR(x)のままになります:VARCHARは非Unicode文字列(文字ごとに1バイト)を格納し、NVARCHARはすべてを文字ごとに2バイトのUnicodeに格納しますモード。ユニコードが必要ですか?文字列にアラビア語、ヘブライ語、中国語、または他の非ヨーロッパ系文字が含まれている可能性がありますか?次にNVARCHARを使用します

(N)VARCHAR列には2つのフレーバーがあります:8000バイト以下になる最大長を定義する(VARCHAR最大8000文字、NVARCHAR最大4000)、またはそうでない場合十分な場合、(N)VARCHAR(MAX)バージョンを使用します。これは、最大2ギガバイトのデータを保存します。

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

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

181
marc_s

nvarchar(max)に進みます。それは要件を満たす必要があります。

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

28
Kangkan

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

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

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

1
Marat Gallyamov