JSON 문자열 저장에 가장 적합한 SQL 데이터 유형은 무엇입니까?


127

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)?

1
임의의 노이즈 (데이터가 아닌 주석) : 압축 할 수도 있습니다. 이 경우 바이너리가 필요합니다. 반면에 데이터에 대한 적절한 테이블을 디자인하지 않는 이유는 무엇입니까?
The Nail

3
@The Nail : 때때로 무언가를 JSON (또는 "문서")으로 저장하는 것이 필요에 적합합니다. 워크 플로 엔진이나 문서 관리 등의 경우처럼 ... 저는 현재 프로젝트에서이 작업을 수행하고 있으며 실제로 CQRS 구현의 명령 측에 대한 관계형에서 문서 접근 방식으로 이동합니다. ServiceStack 또는 JSON.Net과 같은 직렬 변환기를 사용하면 매우 빠릅니다.
swannee

답변:


198

확실히 아닙니다 :

  • TEXT, NTEXT: 이러한 유형은 SQL Server 2005에서 더 이상 사용되지 않으며 새로운 개발에 사용해서는 안됩니다. 사용 VARCHAR(MAX)또는 NVARCHAR(MAX)대신

  • IMAGE, VARBINARY(MAX): IMAGE는처럼 더 이상 사용되지 않으며 TEXT/NTEXT텍스트 문자열을 이진 열에 저장할 필요가 없습니다 ....

따라서 기본적으로 leave VARCHAR(x)또는 NVARCHAR(x): VARCHAR는 비 유니 코드 문자열 (문자 당 1 바이트)을 NVARCHAR저장하고 모든 것을 문자 당 2 바이트 유니 코드 모드로 저장합니다. 그렇다면 유니 코드가 필요합니까? 문자열에 아랍어, 히브리어, 중국어 또는 기타 비서 유럽 문자가 잠재적으로 있습니까? 그런 다음NVARCHAR

(N)VARCHAR열은 두 가지 종류로 제공 : 하나는 8000 바이트 이하 (결과하는 최대 길이 정의 VARCHAR최대 8000 자, NVARCHAR그 충분하지 않습니다 경우 최대 4000가), 또는 사용 (N)VARCHAR(MAX)데이터의 2 기가 바이트까지 저장할 버전.

업데이트 : SQL Server 2016 에는 네이티브 JSON 지원이 포함됩니다. 새로운 JSON데이터 유형 (을 기반으로 함 nvarchar)과 FOR JSON쿼리의 출력을 JSON 형식으로 변환 하는 명령 이 도입 됩니다.

업데이트 # 2 : 최종 제품에서 Microsoft는 별도의 JSON데이터 유형을 포함하지 않았습니다. 대신 유형의 열에서 작동하는 여러 JSON 함수 (데이터베이스 행을 JSON으로 패키징하거나 JSON을 관계형 데이터로 구문 분석)가 있습니다.NVARCHAR(n)


25
NVARCHAR은 SQL Server 2016이 네이티브 JSON 지원에 사용하므로 선호되는 선택이어야합니다. blogs.msdn.com/b/jocapc/archive/2015/05/16/…
Loudenvier

@marc_s "업데이트"문구가 맞습니까? 공식 JSON 데이터 유형을 찾을 수 없습니다 ...?
Nix

2
@Nix : 결국 SQL Server는 데이터 유형에서 작동 하는 JSON 함수 를 지원한다고 생각합니다NVARCHAR(n)
marc_s

2
Json 데이터 유형이 있음을 명시하지 않도록 답변을 업데이트 할 수 있습니다.
Nix

1
압축을 사용할 때 varbinary (max)를 사용할 수 있습니다.
Marat Gallyamov

31

나는 갈 nvarchar(max)것이다. 요구 사항에 맞아야합니다.

업데이트 : SQL Server 2016 및 Azure SQL에는 많은 추가 네이티브 JSON 기능이 있습니다. 이는 디자인이나 접근 방식에 긍정적 인 영향을 미칠 수 있습니다. 자세한 내용은 https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server 를 읽을 수 있습니다.


8
문자 당 2 바이트 유니 코드 저장소가 정말로 필요 합니까 ?? 데이터에 따라 - (당신은하지만 만약 그냥 많이 필요에 따라 바이트 ... 배 낭비 될 수있다 DO - 다음 갈 수있는 유일한 방법은 내가 동의의 그! 필요성 유니 코드)
marc_s

5
nvarchar-데이터가 정의되지 않았기 때문입니다. 우리는 시스템이 유니 코드를 필요로하지 것이라고 생각한다면, 우리는 (최대) VARCHAR로 이동 저장할 수 있습니다
Kangkan

5
또한를 사용 nvarchar하면을 사용할 때 결국 발생하게 될 데이터 정렬 문제 를 피할 수 varchar있지만 쿼리 성능이 varchar. 추가 정보가있는 훌륭한 DBA 질문 입니다.
Scotty.NET

5
이 질문이 어떻게 그렇게 많은 찬성표를 얻었습니까? 따라서 어떤 데이터 유형을 사용할지 알려줍니다. 괜찮습니다.하지만 이것이 올바른 선택 인 이유 를 설명하지도 않습니다 .
stakx - 더 이상 기여하지

1
항상 varchar를 사용하고 모든 유니 코드 문자를 이스케이프 할 수 있습니다. 이것은 nvarchar를 사용하는 것보다 공간을 절약하기 때문에 텍스트에 가끔 유니 코드 문자 만있는 경우에 좋은 접근 방식입니다
chrisb

3

nvarchar(max)SQL 2016 또는 Azure SQL에서 JSON 기능을 사용하려는 경우 사용 하는 것이 좋습니다 .

이러한 기능을 사용할 계획이없는 경우 (및 ) 기능 과 varbinary(max)함께 사용할 수 있습니다 . 추가 정보 : https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/COMPRESSDECOMPRESS

COMPRESS 및 DECOMPRESS 기능은 표준 GZip 압축을 사용합니다. 클라이언트가 GZip 압축을 처리 할 수있는 경우 (예 : gzip 콘텐츠를 이해하는 브라우저) 압축 된 콘텐츠를 직접 반환 할 수 있습니다. 이것은 성능 / 스토리지 트레이드 오프입니다. 압축 된 데이터를 자주 쿼리하는 경우 텍스트를 매번 압축 해제해야하므로 마이그레이션 성능이 느려집니다.


어떤 있습니다 JSON 2016 SQL에 있습니다 ?
Kiquenet


0

nvarchar (max)는 이것에 더 좋습니다. 또한 이와 같이 할 수있는 한 가지 더 있습니다.

public class TableName
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
     
    public string FieldJson { get; set; }   //save json in this field and
      
    [NotMapped]
    public List<FieldList> FieldList  // get return list from this properity
    {
        get => !string.IsNullOrEmpty(FieldJson) ? JsonConvert.DeserializeObject<List<FieldList>>(FieldJson) : null; 
    }

   
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.