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

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

  • NVARCHAR(255)
  • TEXT
  • VARBINARY(MAX)
108695 次浏览

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

更新: 有了 SQLServer2016和 Azure SQL,就有了许多额外的本机 JSON 功能。这可能会对您的设计或方法产生积极的影响。你可能会读到更多: < a href = “ https://Learn.microsoft.com/en-us/sql/闽系数据库/json/json-data-sql-server”rel = “ norefrer”> https://learn.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

当然 没有:

  • TEXT, NTEXT: 这些类型是从 SQLServer2005开始的 不赞成,不应该用于新的开发。使用 VARCHAR(MAX)NVARCHAR(MAX)代替

  • IMAGEVARBINARY(MAX): 与 TEXT/NTEXT一样,IMAGE也不推荐使用,并且将文本字符串存储到二进制列中真的没有意义... ..。

所以基本上只剩下 VARCHAR(x)NVARCHAR(x): VARCHAR存储非 Unicode 字符串(每个字符1字节) ,而 NVARCHAR以每个字符2字节的 Unicode 模式存储所有内容。那么,您需要 Unicode 吗?您的字符串中是否可能包含阿拉伯文、希伯来文、中文或其他非西欧字符?那就用 NVARCHAR

(N)VARCHAR列有两种形式: 一种是定义最大长度为8000字节或更小(VARCHAR到8000个字符,NVARCHAR到4000个字符) ,另一种是如果这还不够,使用 (N)VARCHAR(MAX)版本,它可以存储多达2GByte 的数据。

更新: SQL Server 二零一六年将支持原生 JSON ——将引入一个新的 JSON数据类型(基于 nvarchar) ,以及一个 FOR JSON命令来将查询的输出转换为 JSON 格式

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

如果您计划在 SQL2016或 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 内容的浏览器) ,您可以直接返回压缩内容。请注意,这是性能/存储的权衡。如果经常查询压缩数据,则可能性能较低,因为每次都必须解压缩文本。