用于存储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)
?答案 0 :(得分:175)
当然不:
TEXT, NTEXT
:从SQL Server 2005开始,这些类型已弃用,不应用于新开发。使用VARCHAR(MAX)
或NVARCHAR(MAX)
代替
IMAGE
,VARBINARY(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)