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

Dat*_*tPT 120 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*c_s 184

当然不是:

  • TEXT, NTEXT:从SQL Server 2005开始,这些类型已弃用,不应用于新开发.使用VARCHAR(MAX)NVARCHAR(MAX)代替

  • IMAGE,VARBINARY(MAX):IMAGE已被弃用TEXT/NTEXT,并且将文本字符串存储到二进制列中确实没有意义....

因此,基本上离开VARCHAR(x)NVARCHAR(x):VARCHAR存储非Unicode字符串(每个字符1个字节),并以每个字符NVARCHAR2个字节的Unicode模式存储所有内容.所以你需要Unicode吗?您的字符串中是否有阿拉伯语,希伯来语,中文或其他非西欧字符?然后去NVARCHAR

这些(N)VARCHAR列有两种形式:要么定义最大长度,导致8000字节或更少(VARCHAR最多8000个字符,NVARCHAR最多4000 个字节),或者如果这还不够,请使用(N)VARCHAR(MAX)存储最多2 GB数据的版本.

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

更新#2:在最终产品中,Microsoft没有包含单独的JSON数据类型 - 相反,有许多JSON函数(将数据库行打包成JSON,或将JSON解析为关系数据),这些函数对类型的列进行操作NVARCHAR(n)

  • NVARCHAR应该是首选,因为sql server 2016将使用它来支持其本机JSON http://blogs.msdn.com/b/jocapc/archive/2015/05/16/json-support-in-sql-server- 2016.aspx (24认同)
  • @Nix:我想最后,SQL Server支持对NVARCHAR(n)数据类型进行操作的* JSON函数* (2认同)
  • 您可能想要更新您的答案,不要声明有 Json 数据类型 (2认同)
  • 使用压缩时可以使用 varbinary(max) (2认同)

Kan*_*kan 29

我会去的nvarchar(max).这应符合要求.

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

  • 你真的**需要每个字符2字节的Unicode存储吗?根据你的数据 - 它可能只是浪费了两倍于所需的字节...(但如果你**需要Unicode - 那么这是唯一的方法,我同意!) (8认同)
  • nvarchar - 因为数据未定义.如果我们觉得系统不需要unicode,我们可以节省移动到varchar(max) (5认同)
  • 此外,使用`nvarchar`可以避免使用`varchar`时最终会出现的排序规则问题,但查询性能会比`varchar`慢.[更好的DBA问题](http://dba.stackexchange.com/questions/5346/why-is-there-still-a-varchar-data-type)以及更多信息. (5认同)
  • 这个问题怎么得到这么多的赞成?所以它说要使用哪种数据类型,很好......但它甚至没有尝试解释*为什么*这将是正确的选择. (5认同)