Sdílet prostřednictvím


CHAR (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vrací jednobajtový znak s určeným celočíselným kódem, jak je definován znakovou sadou a kódováním výchozí třídění aktuální databáze.

Transact-SQL konvence syntaxe

Syntaxe

CHAR ( integer_expression )

Arguments

integer_expression

Celé číslo od 0 do 255. CHAR vrací NULL hodnotu pro celočíselné výrazy mimo tento vstupní rozsah nebo nereprezentující úplný znak.

CHAR také vrací hodnotu NULL , když znak překročí délku typu návratu.

Mnoho běžných znakových sad sdílí ASCII jako podmnožinu a vrací stejný znak pro celočíselné hodnoty v rozsahu 0 až 127.

Poznámka:

Některé znakové sady, jako například Unicode a Shift Japanese Industrial Standards, obsahují znaky, které lze reprezentovat v jednobajtovém kódovacím schématu, ale vyžadují vícebajtové kódování. Pro více informací o znakových sadách viz Single-Byte a vícebajtové znakové sady.

Návratové typy

char(1)

Poznámky

Použijte CHAR k vložení řídicích znaků do řetězců znaků. Tato tabulka ukazuje některé často používané ovládací znaky.

Řídicí znak Hodnota
Tab char(9)
Prostor char(32)
Posun o řádek char(10)
Návrat vozíku char(13)

Examples

A. Použijte ASCII a CHAR k vytištění ASCII hodnot z řetězce

Tento příklad vytiskne ASCII hodnotu a znak pro každý znak v řetězci 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

Tady je soubor výsledků.

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

B. Použijte CHAR pro vložení ovládacího znaku

Tento příklad používá CHAR(13) k vytištění jména a e-mailové adresy zaměstnance na samostatné řádky, když dotaz vrací výsledky jako text. Tento příklad využívá databázi AdventureWorks2025.

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

Tady je soubor výsledků.

Ken Sanchez
ken0@adventure-works.com

C. Použijte ASCII a CHAR k vytištění ASCII hodnot z řetězce

Tento příklad předpokládá ASCII znakovou sadu. Vrací hodnotu znaku pro šest různých ASCII čísel znaků.

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

Tady je soubor výsledků.

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

D. Použijte CHAR pro vložení ovládacího znaku

Tento příklad používá CHAR(13) vrácení informací z sys.databases oddělených řádků, když dotaz vrací výsledky jako text.

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

Tady je soubor výsledků.

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. Použijte CHAR pro vrácení jednobajtových znaků

Tento příklad používá celočíselné a hexadecimální hodnoty v platném rozsahu pro ASCII. Funkce CHAR dokáže vyprodukovat jednobajtový japonský znak.

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

Tady je soubor výsledků.

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

F. Použijte CHAR pro vrácení vícebajtových znaků

Tento příklad používá celočíselné a hexadecimální hodnoty v platném rozsahu pro rozšířené ASCII. Funkce však vracíCHAR, NULL protože parametr reprezentuje pouze první bajt vícebajtového znaku. Znak( 2) s dvojbajtem nelze částečně reprezentovat ani dělit bez nějaké konverzní operace. Jednotlivé bajty dvoubajtového znaku obvykle nereprezentují platné hodnoty znaku (1 ).

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

Tady je soubor výsledků.

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

G. Pro vrácení vícebajtových znaků použijte CONVERT místo CHAR

Tento příklad přijímá binární hodnotu jako zakódovaný vícebajtový znak odpovídající výchozí kódové stránce aktuální databáze, s podmínkou ověření. Konverze znaků je rozšířenější a může být alternativou k práci s kódováním na nižší úrovni.

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

Tady je soubor výsledků.

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

H. Použijte NCHAR místo CHAR pro vyhledávání UTF-8 postav

Tento příklad zdůrazňuje rozlišení, které standard Unicode dělá mezi kódovým bodem znaku a sekvencí kódových jednotek v daném kódovacím formuláři. Binární kód přiřazený znaku v klasické znakové sadě je jeho jediným číselným identifikátorem.

Naopak sekvence UTF-8 bajtů přiřazená znaku je algoritmické kódování jeho přiděleného číselného identifikátoru: kódového bodu. UTF-8 char a UTF-16 nchar jsou různé kódovací formy využívající8bitové a 16bitové kódové jednotky stejné znakové sady: Unicode Character Database.

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

Tady je soubor výsledků. Tyto výsledky jsou generovány v _SC rámci kolace s doplňkovou podporou znaků.

Hudební nota Hudební nota (UTF-8) Kód UTF-16LE bajty UTF-8 bajtů
9835 0x6B26 0xE299AB
🎵 🎵 127925 0x3CD8B5DF 0xF09F8EB5