char et varchar (Transact-SQL)

Types de données de chaîne de longueur fixe ou variable.

  • char [ ( n ) ]
    Données de type chaîne non-Unicode de longueur fixe. n définit la longueur de chaîne et doit être compris entre 1 et 8 000. La taille de stockage est égale à n octets. Le synonyme ISO de char est character.

  • varchar [ ( n | max ) ]
    Données de type chaîne non Unicode de longueur variable. n définit la longueur de chaîne et peut être comprise entre 1 et 8 000. max indique que la taille de stockage maximale occupée est de 2^31-1 octets (2 Go). La taille de stockage est la longueur réelle des données entrées, plus deux octets. Les synonymes ISO de varchar sont char varying ou character varying.

Notes

Lorsque la valeur de n n'est spécifiée ni dans une définition de données, ni dans une instruction de déclaration de variable, la longueur par défaut est 1. Quand la valeur de n n'est pas précisé dans les fonctions CAST ou CONVERT, la longueur par défaut est 30.

Les objets qui utilisent char ou varchar reçoivent la collation par défaut de la base de données, sauf si une collection spécifique est affectée à l'aide de la clause COLLATE. Le classement contrôle la page de codes utilisée pour stocker les données de caractères.

Afin de prévenir les problèmes de conversion de caractères si vos sites prennent en charge plusieurs langues, envisagez d'utiliser les types de données Unicode nchar ou nvarchar. Si vous utilisez char ou varchar, nous vous recommandons de suivre les instructions suivantes :

  • Utilisez char lorsque les tailles des entrées de données de colonnes sont cohérentes.

  • Utilisez varchar lorsque les tailles des entrées de données de colonnes varient considérablement.

  • Utilisez varchar(max) lorsque les tailles des entrées de données de colonnes varient considérablement et que la taille peut dépasser 8000 octets.

Si SET ANSI_PADDING a la valeur OFF lors de l'exécution de CREATE TABLE ou ALTER TABLE, une colonne de type char définie comme NULL est considérée comme une colonne de type varchar.

Lorsque la page de codes du classement utilise des caractères sur deux octets, la taille de stockage reste de n octets. En fonction de la chaîne de caractères, la taille de stockage de n octets peut être inférieure à n caractères.

Conversion des données de type caractère

Lorsque des expressions de caractères sont converties en type caractère de taille différente, les valeurs trop longues pour le nouveau type de données sont tronquées. Le type uniqueidentifier est considéré comme un type caractère pour les besoins de la conversion à partir d'une chaîne de caractères ; il est par conséquent soumis aux règles de troncation pour la conversion en un type caractère. Consultez la section Exemples qui suit.

Lorsqu'une expression de caractères est convertie en une expression de caractères de taille ou de type de données différente (par exemple, de char(5) à varchar(5) ou de char(20) à char(15)), le classement de la valeur d'entrée est affecté à la valeur convertie. Si une expression de type non caractère est convertie en un type de données caractère, le classement par défaut de la base de données active est affecté à la valeur convertie. Dans les deux cas, vous pouvez affecter un classement spécifique à l'aide de la clause COLLATE.

[!REMARQUE]

Les interprétations de page de codes sont prises en charge pour les types de données char et varchar, mais pas pour text. De manière identique aux versions antérieures de SQL Server, la perte de données lors de l'interprétation d'une page de codes n'est pas mentionnée.

Les expressions de caractères converties en un type de données numeric approximatif peuvent éventuellement inclure une indication exponentielle (un « e » majuscule ou minuscule éventuellement suivi d'un plus (+) ou d'un moins (-) et du nombre).

Les expressions de caractères converties en un type de données numeric exact doivent être composées de chiffres, d'un point (séparateur décimal en notation anglaise) et éventuellement d'un plus (+) ou d'un moins (-). Les espaces à gauche sont ignorés. Les séparateurs virgule (séparateurs de milliers en notation anglaise comme dans 123,456.00) ne sont pas autorisés dans la chaîne.

Les expressions de caractères converties en types de données money ou smallmoney peuvent également comprendre un point facultatif (séparateur décimal en notation anglaise) et le symbole du dollar ($). Les séparateurs virgule (séparateurs de milliers en notation anglaise comme dans $123,456.00) sont autorisés.

Exemples

A.Affichage de la valeur par défaut de n utilisée dans une déclaration de variable.

L'exemple suivant montre que la valeur par défaut de n est 1 pour les types de données char et varchar lorsqu'ils sont utilisés dans une déclaration de variable.

DECLARE @myVariable AS varchar = 'abc';
DECLARE @myNextVariable AS char = 'abc';
--The following returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO

B.Affichage de la valeur par défaut de n lorsque varchar est utilisé dans CAST et CONVERT.

L'exemple suivant montre que la valeur par défaut de n est 30 lorsque les types de données char ou varchar sont utilisés dans les fonctions CAST et CONVERT.

DECLARE @myVariable AS varchar(40);
SET @myVariable = 'This string is longer than thirty characters';
SELECT CAST(@myVariable AS varchar);
SELECT DATALENGTH(CAST(@myVariable AS varchar)) AS 'VarcharDefaultLength';
SELECT CONVERT(char, @myVariable);
SELECT DATALENGTH(CONVERT(char, @myVariable)) AS 'VarcharDefaultLength';

C.Conversion de données à des fins d'affichage

L'exemple suivant convertit deux colonnes en types caractères et applique un style qui applique un format spécifique aux données affichées. Un type money est converti en données caractères et le style 1 est appliqué, ce qui affiche les valeurs avec une virgule tous les trois chiffres à gauche de la virgule décimale et deux chiffres à droite de la virgule décimale. Un type datetime est converti en données caractères et le style 3 est appliqué, ce qui affiche les données au format jj/mm/aa. Dans la clause WHERE, un type money est converti en un type caractère pour effectuer une opération de comparaison de chaînes.

USE AdventureWorks2012;
GO
SELECT  BusinessEntityID, 
   SalesYTD, 
   CONVERT (varchar(12),SalesYTD,1) AS MoneyDisplayStyle1, 
   GETDATE() AS CurrentDate, 
   CONVERT(varchar(12), GETDATE(), 3) AS DateDisplayStyle3
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%';

Voici l'ensemble des résultats.

BusinessEntityID SalesYTD              DisplayFormat CurrentDate             DisplayDateFormat
---------------- --------------------- ------------- ----------------------- -----------------
278              1453719.4653          1,453,719.47  2011-05-07 14:29:01.193 07/05/11
280              1352577.1325          1,352,577.13  2011-05-07 14:29:01.193 07/05/11
283              1573012.9383          1,573,012.94  2011-05-07 14:29:01.193 07/05/11
284              1576562.1966          1,576,562.20  2011-05-07 14:29:01.193 07/05/11
285              172524.4512           172,524.45    2011-05-07 14:29:01.193 07/05/11
286              1421810.9242          1,421,810.92  2011-05-07 14:29:01.193 07/05/11
288              1827066.7118          1,827,066.71  2011-05-07 14:29:01.193 07/05/11

D.Conversion de données Uniqueidentifer

L'exemple suivant convertit une valeur uniqueidentifier en type de données char.

DECLARE @myid uniqueidentifier = NEWID();
SELECT CONVERT(char(255), @myid) AS 'char';

L'exemple suivant illustre la troncation des données lorsque la valeur est trop longue pour le type de données vers lequel la conversion est effectuée. Étant donné que le type uniqueidentifier est limité à 36 caractères, les caractères qui dépassent cette longueur sont tronqués.

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;

Voici l'ensemble des résultats.

String                                       TruncatedValue
-------------------------------------------- ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong    0E984725-C51C-4BF4-9960-E1C80E27ABA0

(1 row(s) affected)

Voir aussi

Référence

nchar et nvarchar (Transact-SQL)

CAST et CONVERT (Transact-SQL)

COLLATE (Transact-SQL)

Types de données (Transact-SQL)

Concepts

Conversion de types de données (moteur de base de données)

Autres ressources

Estimer la taille d'une base de données