CHAR (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

現在のデータベースの既定の照合順序の文字セットと エンコードで定義されている、指定された整数コードを持つ 1 バイト文字を返します。

Transact-SQL 構文表記規則

構文

CHAR ( integer_expression )

引数

integer_expression

0 ~ 255 の整数です。 この入力範囲外である、または完全な文字を表していない整数式の場合は、CHARNULL 値が返されます。

また、文字が戻り値の型の長さを超えた場合も、CHARNULL 値が返されます。

多くの一般的な文字セットは ASCII をサブセットとして共有し、0 から 127 の範囲の整数値に対して同じ文字を返します。

Note

UnicodeShift_JIS などの一部の文字セットには、1 バイトのコード体系では表現できない文字が含まれ、マルチバイトのエンコードが必要になります。 文字セットについて詳しくは、「1 バイト文字セットとマルチバイト文字セット」をご覧ください。

戻り値の型

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 文字セットを使用します。 6 種類の 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 を使用して 1 バイト文字を返す

この例では、ASCII の有効な範囲内の整数と 16 進値が使用されます。 CHAR 関数は、1 バイトの日本語の文字を出力できます。

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 の有効な範囲内の整数値と 16 進値が使用されます。 ただし、パラメーターではマルチバイト文字の最初のバイトのみが表されるため、CHAR 関数からは NULL が返されます。 char(2) 2 バイト文字を部分的に表したり、何らかの変換操作を行わずに分割したりすることはできません。 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. CHAR の代わりに CONVERT を使用してマルチバイト文字を返す

この例では、現在のデータベースの既定のコードページと一致するエンコードされた検証の対象になるマルチバイト文字としてバイナリ値を受け入れます。 文字変換はより広くサポートされており、下位レベルでエンコードを操作する代わりに使用できます。

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. CHAR の代わりに NCHAR を使用して UTF-8 文字を検索する

この例では、Unicode 標準による特定の "エンコード形式" での文字の "コード ポイント" と "コード単位シーケンス" の間の区別を示します。 従来の文字セットで文字に割り当てられるバイナリ コードは、その数値識別子に過ぎません。

一方、文字に関連付けられた UTF-8 バイト シーケンスは、割り当てられた数値識別子 (コード ポイント) のアルゴリズム エンコードです。 UTF-8 の char と UTF-16 の nchar は、同じ文字セット (Unicode 文字データベース) の 8 ビットと 16 ビットの "コード単位" を使用する異なる "エンコード形式" です。

;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