共用方式為


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 來處理。

當定序字碼頁使用雙位元組字元時,儲存體大小仍是 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 的預設值。

下列範例會顯示搭配 CAST 和 CONVERT 函數來使用 char 或 varchar 資料類型時,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.轉換資料以加以顯示

下列範例將兩個資料行轉換為字元類型,並套用一個會以特定格式顯示資料的樣式。 money 類型會轉換為字元資料,並套用樣式 1:在數值的小數點左側每三位數顯示一個逗號,並在小數點右側留下兩位數。 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.轉換 Uniqueidentifier 資料

下列範例會將 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)

COLLATE (Transact-SQL)

資料類型 (Transact-SQL)

概念

資料類型轉換 (Database Engine)

其他資源

估計資料庫的大小