web-dev-qa-db-fra.com

Comprendre la colonne varchar (max) 8000 et pourquoi je peux y stocker plus de 8000 caractères

De this Microsoft doc, +

n définit la longueur de la chaîne et peut être une valeur comprise entre 1 et 8 000. max indique que la taille de stockage maximale est de 2 ^ 31-1 octets (2 Go). La taille de stockage est la longueur réelle des données entrées + 2 octets.

Veuillez m'aider à comprendre cela.

Le nombre maximal de caractères pour varchar semble être 8000, Ce qui représente bien moins que 2GB De données.

Je vois qu'il y a des enregistrements dans cette colonne varchar(max) d'une table spécifique qui ont len(mycolumn)> 100 000. Ainsi je sais que je peux obtenir bien plus que 8000 Caractères en une colonne varchar(max).

Question 1: Comment les caractères 8000 Entrent-ils en jeu et où dois-je en être conscient?

Question 2 : une requête de lecteur de données .net vers cette colonne renverra-t-elle toujours le résultat complet avec 100 000+ caractères?

13
Peter PitLock

Je peux voir pourquoi vous comprenez mal cela - c'est un peu délicat. Ce sont tous valables:

  • VARCHAR (1) - une chaîne de caractères
  • VARCHAR (4000) - 4000 caractères
  • VARCHAR (8000) - 8 000 caractères - et si vous utilisez un nombre pour la définition de ce champ, c'est le plus grand NUMÉRO que vous pouvez utiliser, mais regardez ceci:
  • VARCHAR (MAX) - celui-ci peut contenir jusqu'à 2 Go.

Et oui, si vous essayez d'extraire des données d'un champ VARCHAR (MAX) et que quelqu'un y stocke 2 Go, attachez votre ceinture.

30
Brent Ozar

Question 1: Comment les 8000 personnages entrent-ils en jeu et où dois-je en être conscient?

Si n est défini sur 8000, 8000 caractères entrent en jeu. Vous devez connaître les références Précision, Échelle et Longueur (Transact-SQL) concernant char, nchar, nvarchar et varchar. En revanche, si n est défini sur max (sans guillemets), SQL Server stocke (et renvoie) le nombre maximal d'octets (comme indiqué dans votre devis).

Question 2: une requête de lecteur de données .net dans cette colonne retournera-t-elle toujours le résultat complet avec 100 000+ caractères?

Il s'agit d'une question .Net (pas un serveur SQL), mais le datareader .Net récupère un flux d'octets. Un octet n'est pas un caractère et SQL Server renvoie des octets (pas des caractères). Si n est défini sur 8000 et que le type de données est nvarchar, SQL Server retourne jusqu'à 8000 octets, ce que le lecteur de données .Net peut interpréter comme 4000 caractères Unicode. Si n est défini sur 8000 et que le type de données est varchar, SQL Server renvoie jusqu'à 8 000 octets, ce que le lecteur de données .Net peut interpréter comme pouvant contenir jusqu'à 8 000 caractères ANSI. Si n est défini sur max et que le type de données est nvarchar, SQL Server renvoie jusqu'à 2 ^ 31-1 octets, ce que le lecteur de données .Net peut interpréter comme comportant jusqu'à (2 ^ 31-1)/2 caractères. Si n est défini sur max et que le type de données est varchar, SQL Server renvoie jusqu'à 2 ^ 31-1 octets, ce que le lecteur de données .Net peut interpréter comme pouvant contenir jusqu'à 2 ^ 31-1 caractères ANSI.

Si vous choisissez d'utiliser char ou varchar (au lieu de nchar ou nvarchar) car ils peuvent stocker plus de "caractères" (plus précisément: octets), vous devez être conscient que de nombreux caractères Unicode n'ont pas de caractère ANSI équivalent (donc une grande partie de notre les utilisateurs du monde ne pourront pas voir leurs caractères localisés/natifs dans votre application).

7
Bill