char および varchar (Transact-SQL)
固定長または可変長の文字列データ型です。
char [ ( n ) ]
Unicode ではない固定長の文字列データです。 n では文字列の長さを定義し、指定できる値の範囲は 1 ~ 8,000 です。 記憶領域のサイズは n バイトです。 char の ISO シノニムは、character です。varchar [ ( n | max ) ]
Unicode ではない可変長の文字列データです。 n では文字列の長さを定義し、指定できる値の範囲は 1 ~ 8,000 です。 max は最大格納サイズが 2^31-1 バイト (2 GB) であることを示します。 格納サイズは、入力したデータの実際の長さ + 2 バイトとなります。 varchar の ISO シノニムは、char varying または character varying です。
説明
データ定義または変数宣言ステートメントで n を指定しないと、既定の長さは 1 になります。 CAST 関数および CONVERT 関数で n を指定しないと、既定の長さは 30 になります。
COLLATE 句で特定の照合順序を指定しない限り、char 型または varchar 型を使用するオブジェクトにはデータベースの既定の照合順序が割り当てられます。 照合順序によって、文字型データの格納に使用されるコード ページが制御されます。
サイトで複数の言語をサポートする場合は、文字変換から生じる問題を最小限にするために、Unicode の nchar 型または nvarchar 型を使用することを検討してください。 char 型または varchar 型を使用する場合は、次のように使い分けます。
列データ エントリのサイズが一定の場合は、char 型を使用します。
列データ エントリのサイズが大幅に異なる場合は、varchar 型を使用します。
列データ エントリのサイズが大幅に異なり、また 8,000 バイトを超える可能性がある場合は、varchar(max) 型を使用します。
CREATE TABLE または ALTER TABLE 実行時に SET ANSI_PADDING が OFF に設定されている場合、NULL として定義されている char 型の列は varchar 型として扱われます。
照合順序のコード ページで 2 バイト文字が使用されている場合、記憶領域のサイズは n バイトのままです。 文字列によって、n バイトの記憶領域のサイズは n 文字未満になる可能性があります。
文字データの変換
文字式を異なるサイズの文字型に変換する場合、値が新しいデータ型にとって長すぎるときは、切り捨てられます。 uniqueidentifier 型は、文字式からの変換のための文字型と見なされるため、文字型に変換する場合は切り捨てルールが適用されます。 例については、後の「例」のセクションを参照してください。
文字式がデータ型やサイズが異なる文字式に変換される場合 (char(5) から varchar(5) や、char(20) から char(15) など)、入力値の照合順序が変換後の値に割り当てられます。 文字式でない式が文字型に変換される場合、現在のデータベースの既定の照合順序が変換後の値に割り当てられます。 どちらの場合でも、COLLATE 句を使用して特定の照合を割り当てることができます。
注 |
---|
コード ページ変換は char 型と varchar 型ではサポートされていますが、text 型ではサポートされていません。 以前のバージョンの SQL Server と同様に、コード ページ変換中のデータの喪失は報告されません。 |
文字式を numeric 型の概算値に変換する場合、その文字式は指数表記を含むことができます。指数表記とは、小文字の e または大文字の E の後に必要に応じてプラス記号 (+) またはマイナス記号 (-) を付け、その後に数字を付けた表記です。
文字式を正確な numeric 型に変換する場合、その文字式は、数字と小数点から構成されている必要があります。必要に応じて、プラス記号 (+) またはマイナス記号 (-) を付けることができます。 先頭の空白は無視されます。 123,456.00 の桁区切り記号のようにコンマを区切り記号として文字列内で使用することはできません。
文字式を money 型または smallmoney 型に変換する場合、その文字式も、小数点とドル記号 ($) を含むことができます。 $123,456.00 のようにコンマを区切り記号として使用できます。
使用例
A. 変数宣言で使用された場合の n の既定値
次の例は、char 型および varchar 型が変数宣言で使用された場合に、n の既定値が 1 になることを示しています。
DECLARE @myVariable AS varchar = 'abc';
DECLARE @myNextVariable AS char = 'abc';
--The following returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO
B. CAST および CONVERT と共に varchar が使用された場合の n の既定値
次の例は、char 型または varchar 型が CAST 関数および CONVERT 関数と共に使用された場合に、n の既定値が 30 になることを示しています。
DECLARE @myVariable AS varchar(40);
SET @myVariable = 'This string is longer than thirty characters';
SELECT CAST(@myVariable AS varchar);
SELECT DATALENGTH(CAST(@myVariable AS varchar)) AS 'VarcharDefaultLength';
SELECT CONVERT(char, @myVariable);
SELECT DATALENGTH(CONVERT(char, @myVariable)) AS 'VarcharDefaultLength';
C. 表示用にデータを変換する
次の例では、2 つの列を文字型に変換し、表示されるデータに特定の形式を適用するスタイルを指定します。 money 型は文字データに変換され、スタイル 1 が適用されます。それによって、整数部分は 3 桁ごとにコンマで区切られ、小数点以下は 2 桁までの値が表示されます。 datetime 型は文字データに変換され、スタイル 3 が適用されます。それによって、dd/mm/yy の形式でデータが表示されます。 WHERE 句の money 型は文字タイプにキャストされ、文字列比較操作が実行されます。
USE AdventureWorks2012;
GO
SELECT BusinessEntityID,
SalesYTD,
CONVERT (varchar(12),SalesYTD,1) AS MoneyDisplayStyle1,
GETDATE() AS CurrentDate,
CONVERT(varchar(12), GETDATE(), 3) AS DateDisplayStyle3
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%';
以下に結果セットを示します。
BusinessEntityID SalesYTD DisplayFormat CurrentDate DisplayDateFormat
---------------- --------------------- ------------- ----------------------- -----------------
278 1453719.4653 1,453,719.47 2011-05-07 14:29:01.193 07/05/11
280 1352577.1325 1,352,577.13 2011-05-07 14:29:01.193 07/05/11
283 1573012.9383 1,573,012.94 2011-05-07 14:29:01.193 07/05/11
284 1576562.1966 1,576,562.20 2011-05-07 14:29:01.193 07/05/11
285 172524.4512 172,524.45 2011-05-07 14:29:01.193 07/05/11
286 1421810.9242 1,421,810.92 2011-05-07 14:29:01.193 07/05/11
288 1827066.7118 1,827,066.71 2011-05-07 14:29:01.193 07/05/11
D. uniqueidentifer 型データを変換する
次の例では、uniqueidentifier 型の値を char 型の値に変換します。
DECLARE @myid uniqueidentifier = NEWID();
SELECT CONVERT(char(255), @myid) AS 'char';
次の例は、変換後のデータ型に対して値が長すぎる場合のデータの切り捨てを示します。 uniqueidentifier 型は 36 文字に制限されているため、この長さを超える文字は切り捨てられます。
DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;
以下に結果セットを示します。
String TruncatedValue
-------------------------------------------- ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0
(1 row(s) affected)
関連項目
参照
nchar および nvarchar (Transact-SQL)
CAST および CONVERT (Transact-SQL)