CHAR (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Restituisce il carattere a byte singolo con il codice intero specificato, come definito dal set di caratteri e dalla codifica delle regole di confronto predefinite del database corrente.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

CHAR ( integer_expression )

Argomenti

integer_expression

Valore intero compreso tra 0 e 255. CHAR restituisce un valore NULL per le espressioni integer esterne a questo intervallo di input o che non rappresentano un carattere completo.

CHAR restituisce anche un valore NULL quando il carattere supera la lunghezza del tipo restituito.

Molti set di caratteri comuni condividono ASCII come subset e restituisce lo stesso carattere per i valori interi nell'intervallo compreso tra 0 e 127.

Nota

Alcuni set di caratteri, tra cui Unicode e Shift Japanese Industrial Standards, includono caratteri che possono essere rappresentati in uno schema di codifica a byte singolo, ma richiedono la codifica multibyte. Per altre informazioni sui set di caratteri, vedere Set di caratteri a byte singolo e multibyte.

Tipi restituiti

char(1)

Osservazioni:

Usare la funzione CHAR per inserire caratteri di controllo nelle stringhe di caratteri. In questa tabella sono elencati i caratteri di controllo usati più di frequente.

Carattere di controllo Valore
Tab char(9)
Space char(32)
Avanzamento riga char(10)
Ritorno a capo char(13)

Esempi

R. Usare ASCII e CHAR per stampare i valori ASCII da una stringa

In questo esempio viene stampato il valore e il carattere ASCII di ogni carattere della stringa 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

Il set di risultati è il seguente.

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

B. Usare CHAR per inserire un carattere di controllo

In questo esempio si usa CHAR(13) per stampare nome e indirizzo di posta elettronica di un dipendente su righe diverse quando i risultati della query vengono restituiti in formato testo. In questo esempio viene utilizzato il database 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

Il set di risultati è il seguente.

Ken Sanchez
ken0@adventure-works.com

C. Usare ASCII e CHAR per stampare i valori ASCII da una stringa

Questo esempio presuppone che si usi un set di caratteri ASCII. Restituisce il valore del carattere per sei diversi valori numerici ASCII.

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];

Il set di risultati è il seguente.

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

D. Usare CHAR per inserire un carattere di controllo

In questo esempio viene CHAR(13) utilizzato per restituire informazioni da sys.databases righe separate, quando la query restituisce i risultati come testo.

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

Il set di risultati è il seguente.

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. Usare CHAR per restituire caratteri a byte singolo

Questo esempio usa valori interi ed esadecimali nell'intervallo valido per ASCII. La funzione CHAR è in grado di restituire il carattere giapponese a byte singolo.

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

Il set di risultati è il seguente.

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

F. Usare CHAR per restituire caratteri multibyte

Questo esempio usa valori interi ed esadecimali nell'intervallo valido per ASCII esteso. La funzione CHAR restituisce tuttavia NULL perché il parametro rappresenta solo il primo byte di un carattere multibyte. Un carattere char(2) a byte doppio non può essere parzialmente rappresentato né diviso senza un'operazione di conversione. I singoli byte di un carattere a byte doppio non rappresentano in genere valori char(1) validi.

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

Il set di risultati è il seguente.

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

G. Usare CONVERT anziché CHAR per restituire caratteri multibyte

Questo esempio accetta il valore binario come carattere multibyte codificato coerente con la tabella codici predefinita del database corrente, soggetta alla convalida. La conversione dei caratteri è più ampiamente supportata e potrebbe essere un'alternativa all'uso della codifica a un livello inferiore.

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];

Il set di risultati è il seguente.

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

H. Usare NCHAR anziché CHAR per cercare caratteri UTF-8

Questo esempio evidenzia la distinzione applicata nello standard Unicode tra il punto di codice di un carattere e la sequenza di unità di codice in una determinata forma di codifica. Il codice binario assegnato a un carattere in un set di caratteri classico è l'unico identificatore numerico.

Al contrario, la sequenza di byte UTF-8 associata a un carattere è una codifica algoritmica dell'identificatore numerico assegnato: il punto di codice. UTF-8 char e UTF-16 nchar sono forme di codifica diverse che usano unità di codice a 8 bit e a 16 bit dello stesso set di caratteri: Unicode Character Database (UCD).

;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;

Il set di risultati è il seguente. Questi risultati vengono generati in regole _SC di confronto con supporto carattere supplementare.

Nota musicale Nota musicale (UTF-8) Punto di codice Byte UTF-16LE Byte UTF-8
9835 0x6B26 0xE299AB
🎵 🎵 127925 0x3CD8B5DF 0xF09F8EB5