web-dev-qa-db-fra.com

Quel est le meilleur type de données SQL pour stocker la chaîne JSON?

Quel est le meilleur type de données SQL pour stocker une chaîne JSON?

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

Quel type de données SQL devrions-nous utiliser pour stocker une telle chaîne contenant du JSON?

  • NVARCHAR(255)?
  • TEXT?
  • VARBINARY(MAX)?
108
DatPT

Certainement PAS:

  • TEXT, NTEXT: ces types sont obsolètes à partir de SQL Server 2005 et ne doivent pas être utilisés pour un nouveau développement. Utilisez VARCHAR(MAX) ou NVARCHAR(MAX) à la place

  • IMAGE, VARBINARY(MAX): IMAGE est obsolète, tout comme TEXT/NTEXT et il n'y a aucun intérêt à stocker une chaîne de texte dans une colonne binaire ....

Donc, cela laisse fondamentalement VARCHAR(x) ou NVARCHAR(x): VARCHAR stocke les chaînes non Unicode (1 octet par caractère) et NVARCHAR tout en mode Unicode à 2 octets par caractère. Alors avez-vous besoin de l'Unicode? Avez-vous potentiellement des caractères arabes, hébreux, chinois ou d'autres caractères non occidentaux européens dans vos chaînes? Ensuite, allez avec NVARCHAR

Les colonnes (N)VARCHAR sont de deux types: soit vous définissez une longueur maximale de 8 000 octets ou moins (VARCHAR jusqu'à 8000 caractères, NVARCHAR jusqu'à 4000), ou si cela ne suffit pas, utilisez les versions de (N)VARCHAR(MAX), qui stockent jusqu'à 2 GByte de données.

Mise à jour: SQL Server 2016 aura le support JSON natif - un nouveau type de données JSON (basé sur nvarchar) sera introduit, ainsi qu'une commande FOR JSON pour convertir le résultat d'une requête au format JSON.

Mise à jour n ° 2: dans le produit final, Microsoft n'a pas inclus de type de données JSON distinct. Au lieu de cela, il existe un certain nombre de fonctions JSON (pour conditionner les lignes de base de données dans JSON ou pour analyser JSON en données relationnelles) opère sur des colonnes de type NVARCHAR(n)

169
marc_s

Je vais aller pour nvarchar(max). Cela devrait correspondre à l'exigence.

Update: Avec SQL Server 2016 et Azure SQL, il existe de nombreuses fonctionnalités JSON natives supplémentaires. Cela pourrait avoir un impact positif sur votre conception ou votre approche. Vous pouvez lire ceci pour plus: https://docs.Microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

25
Kangkan

Je recommanderais d'utiliser nvarchar(max) si vous envisagez d'utiliser les fonctionnalités JSON sur SQL 2016 ou Azure SQL.

Si vous ne prévoyez pas d’utiliser ces fonctionnalités, vous pouvez utiliser varbinary(max) combiné aux fonctions COMPRESS (et DECOMPRESS). Plus d'informations: https://blogs.msdn.Microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/

Les fonctions COMPRESS et DECOMPRESS utilisent la compression GZip standard. Si votre client peut gérer la compression GZip (par exemple, un navigateur qui comprend le contenu gzip), vous pouvez directement renvoyer un contenu compressé. Notez qu'il s'agit d'un compromis performance/stockage. Si vous interrogez fréquemment des données compressées, vos performances sont ralenties car le texte doit être décompressé à chaque fois.

0
Marat Gallyamov