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 |