Partage via


CHAR (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Retourne le caractère à octet unique avec le code entier spécifié, tel que défini par le jeu de caractères et l’encodage du classement par défaut de la base de données active.

Conventions de la syntaxe Transact-SQL

Syntaxe

CHAR ( integer_expression )

Arguments

integer_expression

Entier compris entre 0 et 255. CHAR retourne la valeur NULL pour les expressions d’entier situées en dehors de cette plage d’entrée ou qui ne représente pas un caractère complet.

CHAR retourne également la valeur NULL quand le caractère dépasse la longueur du type de retour.

De nombreux jeux de caractères communs partagent ASCII en tant que sous-ensemble et retournent le même caractère pour les valeurs entières de la plage 0 à 127.

Remarque

Certains jeux de caractères, comme Unicode et Shift Japanese Industrial Standards, comprennent des caractères qui peuvent être représentés dans un système de codage à un octet, mais nécessitent un codage multioctets. Pour plus d’informations sur les jeux de caractères, consultez Jeux de caractères codés sur un octet et multioctets.

Types de retour

char(1)

Remarques

Utilisez CHAR pour insérer des caractères de contrôle dans des chaînes de caractères. Ce tableau répertorie quelques-uns des caractères de contrôle les plus utilisés.

Caractère de contrôle Value
Onglet char(9)
Space char(32)
Saut de ligne char(10)
Retour chariot char(13)

Exemples

R. Utiliser ASCII et CHAR pour imprimer des valeurs ASCII à partir d’une chaîne

Cet exemple imprime la valeur et le caractère ASCII de chacun des caractères de la chaîne New Moon.

SET TEXTSIZE 0;
-- Create variables for the character string and for the current
-- position in the string.
DECLARE @position INT, @string CHAR(8);
-- Initialize the current position and the string variables.
SET @position = 1;
SET @string = 'New Moon';
WHILE @position <= DATALENGTH(@string)
   BEGIN
   SELECT ASCII(SUBSTRING(@string, @position, 1)),
      CHAR(ASCII(SUBSTRING(@string, @position, 1)))
   SET @position = @position + 1
   END;
GO

Voici le jeu de résultats.

----------- -
78          N
----------- -
101         e
----------- -
119         w
----------- -
32
----------- -
77          M
----------- -
111         o
----------- -
111         o
----------- -
110         n

B. Utiliser CHAR pour insérer un caractère de contrôle

Cet exemple utilise CHAR(13) pour imprimer le nom et l’adresse e-mail d’un employé sur des lignes distinctes, quand la requête retourne ses résultats sous forme de texte. Cet exemple utilise la base de données AdventureWorks2022.

SELECT p.FirstName + ' ' + p.LastName + CHAR(13) + pe.EmailAddress
FROM Person.Person p
INNER JOIN Person.EmailAddress pe
    ON p.BusinessEntityID = pe.BusinessEntityID
        AND p.BusinessEntityID = 1;
GO

Voici le jeu de résultats.

Ken Sanchez
ken0@adventure-works.com

C. Utiliser ASCII et CHAR pour imprimer des valeurs ASCII à partir d’une chaîne

Cet exemple suppose un jeu de caractères ASCII. Il retourne la valeur de caractère pour six nombres de caractère ASCII différents.

SELECT CHAR(65) AS [65], CHAR(66) AS [66],
CHAR(97) AS [97], CHAR(98) AS [98],
CHAR(49) AS [49], CHAR(50) AS [50];

Voici le jeu de résultats.

65   66   97   98   49   50
---- ---- ---- ---- ---- ----
A    B    a    b    1    2

D. Utiliser CHAR pour insérer un caractère de contrôle

Cet exemple utilise CHAR(13) pour renvoyer des informations à partir de sys.databases lignes distinctes, lorsque la requête retourne ses résultats sous forme de texte.

SELECT name, 'was created on ',
    create_date,
    CHAR(13),
    name,
    'is currently ',
    state_desc
FROM sys.databases;
GO

Voici le jeu de résultats.

name                                      create_date               name                                  state_desc
--------------------------------------------------------------------------------------------------------------------
master                    was created on  2003-04-08 09:13:36.390   master                  is currently  ONLINE
tempdb                    was created on  2014-01-10 17:24:24.023   tempdb                  is currently  ONLINE
AdventureWorksPDW2012     was created on  2014-05-07 09:05:07.083   AdventureWorksPDW2012   is currently  ONLINE

E. Utiliser CHAR pour retourner des caractères d’un octet

Cet exemple utilise les valeurs d’entier et hexadécimales dans la plage valide pour ASCII. La fonction CHAR peut sortir les caractères japonais codés sur un octet.

SELECT CHAR(188) AS single_byte_representing_complete_character,
  CHAR(0xBC) AS single_byte_representing_complete_character;
GO

Voici le jeu de résultats.

single_byte_representing_complete_character single_byte_representing_complete_character
------------------------------------------- -------------------------------------------
シ                                           シ

F. Utiliser CHAR pour retourner des caractères multioctets

Cet exemple utilise les valeurs d’entier et hexadécimales dans la plage valide du jeu de caractères ASCII étendu. Toutefois, la fonction CHAR retourne la valeur NULL, car le paramètre représente uniquement le premier octet d’un caractère multioctet. Un caractère double octet(2) ne peut pas être partiellement représenté ni divisé sans opération de conversion. Les octets individuels d’un caractère double octet ne représentent généralement pas les valeurs char(1) valides.

SELECT CHAR(129) AS first_byte_of_double_byte_character,
  CHAR(0x81) AS first_byte_of_double_byte_character;
GO

Voici le jeu de résultats.

first_byte_of_double_byte_character first_byte_of_double_byte_character
----------------------------------- -----------------------------------
NULL                                NULL

G. Utiliser CONVERT au lieu de CHAR pour retourner des caractères multioctets

Dans cet exemple, la valeur binaire est acceptée en tant que caractère multioctet encodé cohérent avec la page de codes par défaut de la base de données actuelle, sous réserve de validation. La conversion de caractères est plus largement prise en charge et peut être une alternative à l’utilisation de l’encodage à un niveau inférieur.

CREATE DATABASE [multibyte-char-context] COLLATE Japanese_CI_AI;
GO

USE [multibyte-char-context];
GO

SELECT NCHAR(0x266A) AS [eighth-note],
    CONVERT(CHAR(2), 0x81F4) AS [context-dependent-convert],
    CAST(0x81F4 AS CHAR(2)) AS [context-dependent-cast];

Voici le jeu de résultats.

eighth-note context-dependent-convert context-dependent-cast
----------- ------------------------- ----------------------
♪           ♪                         ♪

H. Utiliser NCHAR au lieu de CHAR pour rechercher des caractères UTF-8

Cet exemple met en évidence la distinction que la norme Unicode effectue entre le point de code d’un caractère et la séquence d’unités de code sous une forme d’encodage donnée. Le code binaire assigné à un caractère dans un jeu de caractères classique est son seul identificateur numérique.

En revanche, la séquence d’octets UTF-8 associée à un caractère est un encodage algorithmique de son identificateur numérique affecté : le point de code. UTF-8 char et UTF-16 nchar sont des formes de codage différentes utilisant des unités de code sur 8 bits et 16 bits du même jeu de caractères : la base de données de caractères Unicode.

;WITH uni (c)
AS (
    -- BMP character
    SELECT NCHAR(9835)    
    UNION ALL
    -- non-BMP supplementary character or, under downlevel collation, NULL
    SELECT NCHAR(127925)
),
enc (u16c, u8c)
AS (SELECT c, CONVERT(VARCHAR(4), c COLLATE Latin1_General_100_CI_AI_SC_UTF8) FROM uni)
SELECT u16c AS [Music note],
    u8c AS [Music note (UTF-8)],
    UNICODE(u16c) AS [Code Point],
    CONVERT(VARBINARY(4), u16c) AS [UTF-16LE bytes],
    CONVERT(VARBINARY(4), u8c) AS [UTF-8 bytes]
FROM enc;

Voici le jeu de résultats. Ces résultats sont générés sous un _SC classement avec prise en charge supplémentaire des caractères.

Note de musique Note musicale (UTF-8) Point de code Octets UTF-16LE UTF-8 octets
9835 0x6B26 0xE299AB
🎵 🎵 127925 0x3CD8B5DF 0xF09F8EB5