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

13

À partir de ce document Microsoft, +

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 est bien inférieur à la 2GBvaleur des données.

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

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

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?

Peter PitLock
la source
Notez qu'il a varchar(max)été appelé une fois textet a été traité comme un type de données différent.
M. Lister
Peut-être lu ça ? Son lié aux tailles de page 8K. Les valeurs trop grandes pour tenir sur une seule page (la limite est en fait légèrement supérieure à 8 000) sont enregistrées dans les pages LOB_DATA (Large OBject).
Justin

Réponses:

30

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.

Brent Ozar
la source
3
and somebody stored 2GB in there, buckle up.- Été là avec quelques fichiers blob
Ruslan
7

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 de précision, d'échelle et de 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'à 8000 octets, ce que le lecteur de données .Net peut interpréter comme pouvant contenir jusqu'à 8000 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).

Facture
la source