用于存储JSON字符串的最佳SQL数据类型是什么?

时间:2012-02-09 08:18:53

标签: sql sql-server json

用于存储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;
}

我们应该使用哪种SQL数据类型来存储包含JSON的字符串?

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

4 个答案:

答案 0 :(得分:175)

当然

  • 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列有两种形式:要么定义最大长度为8000字节或更少(VARCHAR最多8000个字符,NVARCHAR最多4000个),或者如果这还不够,请使用(N)VARCHAR(MAX)版本,该版本最多可存储2 GB的数据。

更新:SQL Server 2016 将具有本机JSON支持 - 将引入新的JSON数据类型(基于nvarchar) ,以及用于将查询输出转换为JSON格式的FOR JSON命令

在最终产品中

更新#2:,Microsoft没有包含单独的JSON数据类型 - 而是有许多JSON函数(将数据库行打包成JSON) ,或将JSON解析为关系数据),对NVARCHAR(n)

类型的列进行操作

答案 1 :(得分:26)

我会选择 nvarchar(max) 。这应符合要求。

<强>更新 使用SQL Server 2016和Azure SQL,还有许多其他本机JSON功能。这可能对您的设计或方法产生积极影响。您可以阅读以下内容:https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

答案 2 :(得分:1)

如果您计划在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的性能会降低,因为每次都必须解压缩文本。

答案 3 :(得分:1)