CHAR (Transact-SQL)

適用範圍: 是SQL Server (所有支援的版本) 是Azure SQL Database 是Azure SQL 受控執行個體 是Azure Synapse Analytics 是平行處理資料倉儲

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

主題連結圖示 Transact-SQL 語法慣例

語法

CHAR ( integer_expression )  

注意

若要檢視 SQL Server 2014 與更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

integer_expression
0 到 255 之間的整數。 CHAR 傳回 NULL 此輸入範圍之外的整數運算式值,或不代表完整字元的值。 CHAR``NULL當字元超過傳回型別的長度時,也會傳回值。 許多常見的字元集會以子集合的形式共用 ASCII,而且會針對範圍0到127的整數值傳回相同的字元。

注意

某些字元集(例如 Unicode班日文工業標準)包含可在單一位元組編碼配置中表示的字元,但需要多位元組編碼。 如需有關字元集的詳細資訊,請參閱單位元組和多位元組字元集

傳回類型

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) 於個別行中列印員工的名稱和電子郵件地址。 這個範例會使用 AdventureWorks2012 資料庫。

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 字元和 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)