CHAR (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
傳回具有指定整數碼的單一位元組位元,如目前資料庫的字元集和編碼 方式 所定義。
語法
CHAR ( integer_expression )
引數
integer_expression
0 到 255 之間的整數。 對於此輸入範圍以外或不代表完整字元的整數運算式,CHAR
會傳回 NULL
值。
當字元超過傳回類型的長度時,CHAR
也會傳回 NULL
值。
許多通用字元集會以子集的形式共用 ASCII,並針對範圍 0 到 127 中的整數值傳回相同的字元。
注意
某些字元集 (例如 Unicode 和 Shift Japanese Industrial Standards) 包含能以單一位元組編碼配置表示、但需要多位元組編碼的字元。 如需有關字元集的詳細資訊,請參閱單位元組和多位元組字元集。
傳回類型
char(1)
備註
使用 CHAR
將控制字元插入字元字串。 此表顯示一些常用的控制字元。
控制字元 | 值 |
---|---|
索引標籤 | char(9) |
Space | char(32) |
換行字元 | 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
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
,因為參數僅代表多位元組字元的第一個位元組。 字元(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
產生。
音樂筆記 | 音樂音符 (UTF-8) | 程式代碼點 | UTF-16LE 位元組 | UTF-8 個字節 |
---|---|---|---|---|
♫ | ♫ | 9835 | 0x6B26 | 0xE299AB |
🎵 | 🎵 | 127925 | 0x3CD8B5DF | 0xF09F8EB5 |