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