CHAR (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

返回具有指定整数代码的单字节字符,由当前数据库默认排序规则的字符集和编码定义。

Transact-SQL 语法约定

语法

CHAR ( integer_expression )  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

integer_expression
0 到 255 之间的整数。 对于此输入范围外的整数表达式或不表示完整字符的整数表达式,CHAR 返回 NULL 值。 字符超出了返回类型的长度时,CHAR 也会返回 NULL 值。 许多常见字符集共享 ASCII 作为子集,并对 0 到 127 之间的整数值返回相同的字符。

注意

某些字符集(如 UnicodeShift 日本工业标准)包括可以以单字节编码方案表示但需要多字节编码的字符。 有关字符集的详细信息,请参阅单字节和多字节字符集

返回类型

char(1)

注解

使用 CHAR 可将控制字符插入字符字符串中。 此表显示了一些常用的控制字符。

控制字符
选项卡 char(9)
换行 char(10)
回车 char(13)

示例

A. 使用 ASCII 和 CHAR 打印字符串的 ASCII 值

此示例将输出字符串 New Moon 中每个字符的 ASCII 值和字符。

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
  
(1 row(s) affected)

C. 使用 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 

E. 使用 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 返回多字节字符

此示例使用扩展的 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 字符

此示例强调了在给定编码形式下,Unicode 标准造成的字符的码位与代码单元序列之间的区别 。 分配给经典字符集中某个字符的二进制代码是其唯一的数字标识符。 相反,与字符关联的 UTF-8 字节序列是其分配的数字标识符(码位)的算法编码。 UTF-8 char 和 UTF-16 nchar 是使用 8 位和 16 位代码单元的不同编码形式,属于相同的字符集:Unicode 字符数据库 。

; 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 排序规则下生成,支持补充字符。

Music note Music note (UTF-8) Code Point  UTF-16LE bytes UTF-8 bytes
---------- ------------------ ----------- -------------- -----------
♫          ♫                  9835        0x6B26         0xE299AB
🎵         🎵                 127925      0x3CD8B5DF     0xF09F8EB5

另请参阅

ASCII (Transact-SQL)
NCHAR (Transact-SQL)
UNICODE (Transact-SQL)
+(字符串串联)(Transact-SQL)
字符串函数 (Transact-SQL)