Поделиться через


CHAR (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric

Возвращает однобайтовый символ с указанным целым кодом, как определено набором символов и кодировкой сортировки текущей базы данных по умолчанию .

Соглашения о синтаксисе Transact-SQL

Синтаксис

CHAR ( integer_expression )

Аргументы

integer_expression

Целое число от 0 до 255. CHAR возвращает значение NULL для целочисленных выражений, которые выходят за пределы этого входного диапазона или не представляют полный символ.

CHAR также возвращает значение NULL, если символ превышает длину возвращаемого типа.

Многие распространенные наборы символов используют ASCII в качестве подмножества и возвращают тот же символ для целых значений в диапазоне от 0 до 127.

Примечание.

Некоторые кодировки, такие как Юникод и Shift Japanese Industrial Standards (Shift JIS), содержат символы, которые могут быть представлены в однобайтовой схеме кодирования, но требуют многобайтового кодирования. Дополнительные сведения о кодировках см. в статье Однобайтовые и многобайтовые кодировки.

Типы возвращаемых данных

char(1)

Замечания

Функция CHAR может использоваться для вставки управляющих символов в символьные строки. В этой таблице показаны некоторые часто используемые управляющие символы.

Управляющий символ Значение
Вкладка char(9)
Space char(32)
Перевод строки char(10)
Возврат каретки char(13)

Примеры

А. Использование ASCII и CHAR для печати значений ASCII из строки

В этом примере отображается значение ASCII и символ для каждого символа в строке 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

Вот результирующий набор.

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

B. Использование CHAR для вставки символа элемента управления

В этом примере используется выражение CHAR(13), чтобы отображать имя и адрес электронной почты сотрудника в отдельных строках, когда результаты запроса возвращаются в виде текста. В этом примере используется база данных 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

Вот результирующий набор.

Ken Sanchez
ken0@adventure-works.com

В. Использование ASCII и CHAR для печати значений ASCII из строки

В этом примере используется набор символов ASCII. В нем возвращается значение символа для шести разных числовых значений символов 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];

Вот результирующий набор.

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

D. Использование CHAR для вставки символа элемента управления

В этом примере используется CHAR(13) для возврата информации из sys.databases отдельных строк, когда запрос возвращает результаты в виде текста.

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

Вот результирующий набор.

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

Е. Использование CHAR для возврата однобайтовых символов

В этом примере используется целое и шестнадцатеричное значения в допустимом диапазоне кодировки ASCII. Функция CHAR может возвратить однобайтовый японский символ.

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

Вот результирующий набор.

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

F. Использование CHAR для возврата многобайтовых символов

В этом примере используется целое и шестнадцатеричное значения в допустимом диапазоне кодировки Extended ASCII. Функция CHAR возвращает значение NULL, так как параметр представляет только первый байт многобайтового символа. Символ char(2) двойной байт не может быть частично представлен или разделен без какой-то операции преобразования. Отдельные байты двухбайтового символа обычно не представляют допустимые значения char(1).

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

Вот результирующий набор.

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

G. Используйте convert вместо CHAR для возврата многобайтовых символов

В этом примере двоичное значение принимается в виде закодированного многобайтового символа, соответствующего кодовой странице текущей базы данных по умолчанию (подлежит проверке). Преобразование символов более широко поддерживается и может быть альтернативой работе с кодировкой на более низком уровне.

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

Вот результирующий набор.

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

H. Используйте NCHAR вместо CHAR для поиска символов UTF-8

В этом примере демонстрируется различие, которое проводится в стандарте Юникод между кодовой точкой символа и последовательностью кодовой единицы в заданной форме кодировки. Двоичный код, назначенный символу в классической кодировке, является его единственным числовым идентификатором.

В отличие от этого последовательность байтов UTF-8, связанная с символом, является алгоритмическим кодированием назначенного ему числового идентификатора: кодовой точки. UTF-8 char и UTF-16 nchar — это разные формы кодировки с использованием 8-битных и 16-битных кодовых единиц одной и той же кодировки: базы данных символов Юникода.

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

Вот результирующий набор. Эти результаты создаются под _SC параметрами сортировки с дополнительной поддержкой символов.

Музыкальные заметки Музыкальная заметка (UTF-8) Точка кода байты UTF-16LE UTF-8 байт
9835 0x6B26 0xE299AB
🎵 🎵 127925 0x3CD8B5DF 0xF09F8EB5