CHAR (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库
返回具有指定整数代码的单字节字符,由当前数据库默认排序规则的字符集和编码定义。
语法
CHAR ( integer_expression )
注意
若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档。
参数
integer_expression
0 到 255 之间的整数。 对于此输入范围外的整数表达式或不表示完整字符的整数表达式,CHAR
返回 NULL
值。
字符超出了返回类型的长度时,CHAR
也会返回 NULL
值。
许多常见字符集共享 ASCII 作为子集,并对 0 到 127 之间的整数值返回相同的字符。
注意
某些字符集(如 Unicode 和 Shift 日本工业标准)包括可以以单字节编码方案表示但需要多字节编码的字符。 有关字符集的详细信息,请参阅单字节和多字节字符集。
返回类型
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)
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈