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 |