分享方式:


CHAR (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲

傳回具有指定整數碼的單一位元組位元,如目前資料庫的字元集和編碼 方式 所定義。

Transact-SQL 語法慣例

語法

CHAR ( integer_expression )

引數

integer_expression

0 到 255 之間的整數。 對於此輸入範圍以外或不代表完整字元的整數運算式,CHAR 會傳回 NULL 值。

當字元超過傳回類型的長度時,CHAR 也會傳回 NULL 值。

許多通用字元集會以子集的形式共用 ASCII,並針對範圍 0 到 127 中的整數值傳回相同的字元。

注意

某些字元集 (例如 UnicodeShift 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