Aracılığıyla paylaş


char ve varchar (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Sabit boyutlu, karakterli veya değişken boyutlu, varchar karakter veri türleri. SQL Server 2019'dan (15.x) başlayarak, UTF-8 etkin harmanlama kullanıldığında, bu veri türleri unicode karakter verilerinin tam aralığını depolar ve UTF-8 karakter kodlamasını kullanır. UTF-8 olmayan bir harmanlama belirtilirse, bu veri türleri bu harmanlamanın ilgili kod sayfası tarafından desteklenen karakterlerin yalnızca bir alt kümesini depolar.

Arguments

char [ ( n ) ]

Sabit boyutlu dize verileri. n , dize boyutunu bayt cinsinden tanımlar ve 1 ile 8.000 arasında bir değer olmalıdır. gibi Latintek baytlı kodlama karakter kümeleri için depolama boyutu n bayt ve depolanabilen karakter sayısı da n'dir. Çok baytlı kodlama karakter kümeleri için depolama boyutu hala n bayttır, ancak depolanabilecek karakter sayısı n'den küçük olabilir. Char için ISO eş anlamlısı karakterdir. Karakter kümeleri hakkında daha fazla bilgi için bkz. Single-Byte ve Çok Baytlı Karakter Kümeleri.

varchar [ ( n | maksimum ) ]

Değişken boyutlu dize verileri. Dize boyutunu bayt cinsinden tanımlamak için n kullanın ve 1 ile 8.000 arasında bir değer olabilir veya Doku Veri Ambarı'nda en fazla 2^31-1 bayt (2 GB) veya 1 MB'lık bir depolama alanına kadar sütun kısıtlama boyutunu belirtmek için en yüksek değeri kullanın. gibi Latintek baytlı kodlama karakter kümeleri için depolama boyutu n bayt + 2 bayt ve depolanabilen karakter sayısı da n'dir. Çok baytlı kodlama karakter kümeleri için depolama boyutu hala n bayt + 2 bayttır, ancak depolanabilecek karakter sayısı n'den küçük olabilir. Varchar için ISO eş anlamlıları karakter veyakarakter farklılık gösterir. Karakter kümeleri hakkında daha fazla bilgi için bkz. Single-Byte ve Çok Baytlı Karakter Kümeleri.

Remarks

Yaygın bir yanılgı, karakter(n) ve varchar(n) ile n'nin karakter sayısını tanımladığını düşünmektir. Ancak, char(n) ve varchar(n)'de n , dize uzunluğunu bayt cinsinden tanımlar (0 - 8.000). n hiçbir zaman depolanabilecek karakter sayısını tanımlamaz. Bu kavram nchar ve nvarchar tanımına benzer.

Yanlış anlamanın nedeni, tek baytlı kodlama kullanılırken char ve varchar depolama boyutunun n bayt ve karakter sayısının da n olmasıdır. Ancak UTF-8 gibi çok baytlı kodlama için, daha yüksek Unicode aralıkları (128 - 1.114.111) iki veya daha fazla bayt kullanan bir karaktere neden olur. Örneğin, char(10) olarak tanımlanan bir sütunda, Veritabanı Altyapısı tek bayt kodlaması kullanan 10 karakter depolayabilir (Unicode aralığı 0 ile 127 arasında), ancak çok baytlı kodlama kullanılırken 10 karakterden daha az (Unicode aralığı 128 ile 1.114.111 arasında). Unicode depolama ve karakter aralıkları hakkında daha fazla bilgi için bkz. UTF-8 ile UTF-16 arasındaki depolama farkları.

n bir veri tanımında veya değişken bildirim deyiminde belirtilmediğinde varsayılan uzunluk 1'dir. ve işlevleri kullanılırken CASTCONVERT belirtilmezse, varsayılan uzunluk 30'dur.

char veya varchar kullanan nesnelere, yan tümcesi kullanılarak belirli bir harmanlama atanmadığı sürece veritabanının COLLATE varsayılan harmanlaması atanır. Harmanlama, karakter verilerini depolamak için kullanılan kod sayfasını denetler.

SQL Server'da çok baytlı kodlamalar şunlardır:

  • 936 ve 950 (Çince), 932 (Japonca) veya 949 (Korece) kod sayfalarını kullanan bazı Doğu Asya dilleri için çift baytlık karakter kümeleri (DBCS).

  • Kod sayfası 65001 olan UTF-8.

    Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri.

Birden çok dili destekleyen siteleriniz varsa:

  • SQL Server 2019'dan (15.x) başlayarak, Unicode'u desteklemek ve karakter dönüştürme sorunlarını en aza indirmek için UTF-8 özellikli harmanlama kullanmayı göz önünde bulundurun.
  • SQL Server Veritabanı Altyapısı'nın önceki bir sürümünü kullanıyorsanız karakter dönüştürme sorunlarını en aza indirmek için Unicode nchar veya nvarchar veri türlerini kullanmayı göz önünde bulundurun.

char veya varchar kullanıyorsanız şunları yapmanızı öneririz:

  • Sütun veri girdilerinin boyutları tutarlı olduğunda char kullanın.
  • Sütun veri girdilerinin boyutları önemli ölçüde değiştiğinde varchar kullanın.
  • Sütun veri girdilerinin boyutları önemli ölçüde değiştiğinde ve dize uzunluğu 8.000 baytı aştığında varchar(max) kullanın.

veya yürütülürken SET ANSI_PADDINGOFF ise, olarak CREATE TABLE tanımlanan bir ALTER TABLE sütunu varchar olarak işlenir.NULL

Warning

Null olmayan her varchar(max) veya nvarchar(max) sütunu, sıralama işlemi sırasında 8.060 bayt satır sınırına göre sayılan 24 bayt ek sabit ayırma gerektirir. Bu, tabloda oluşturulabilecek null olmayan varchar(max) veya nvarchar(max) sütunlarının sayısıyla ilgili örtük bir sınır oluşturabilir.

Tablo oluşturulduğunda (satır boyutu üst sınırının izin verilen en fazla 8.060 bayt'ı aştığını belirten olağan uyarının ötesinde) veya veri ekleme sırasında özel bir hata sağlanmadı. Bu büyük satır boyutu, kümelenmiş dizin anahtarı güncelleştirmesi veya tam sütun kümesinin sıralamaları gibi bazı normal işlemler sırasında hatalara (hata 512 gibi) neden olabilir ve bu durum yalnızca bir işlem gerçekleştirilirken gerçekleşir.

Karakter verilerini dönüştürme

Karakter ifadeleri farklı boyutta bir karakter veri türüne dönüştürüldüğünde, yeni veri türü için çok uzun olan değerler kesilir. Uniqueidentifier türü, bir karakter ifadesinden dönüştürme amacıyla bir karakter türü olarak kabul edilir ve bu nedenle karakter türüne dönüştürmeye yönelik kesme kurallarına tabidir. Örnekler bölümüne bakın.

Karakter ifadesi, karakter (5) karakterden varchar(5) veya char( 20) karakterinden char( 15) gibi farklı bir veri türüne veya boyuttaki bir karakter ifadesine dönüştürüldüğünde, giriş değerinin harmanlanması dönüştürülen değere atanır. Karakter olmayan bir ifade karakter veri türüne dönüştürülürse, dönüştürülen değere geçerli veritabanının varsayılan harmanlaması atanır. Her iki durumda da COLLATE yan tümcesini kullanarak belirli bir harmanlama atayabilirsiniz.

Note

Kod sayfası çevirileri karakter ve varchar veri türleri için desteklenir, ancak metin veri türü için desteklenmez. SQL Server'ın önceki sürümlerinde olduğu gibi, kod sayfası çevirileri sırasında veri kaybı bildirilir.

Yaklaşık bir sayısal veri türüne dönüştürülen karakter ifadeleri isteğe bağlı üstel gösterim içerebilir. Bu notasyon küçük e veya büyük E harften sonra isteğe bağlı artı () veya eksi (+-) işareti ve ardından bir sayıdır.

Tam sayısal veri türüne dönüştürülen karakter ifadeleri basamaklardan, ondalık ayırıcıdan ve isteğe bağlı artı () veya eksiden+ (-) oluşmalıdır. Baştaki boşluklar yoksayılır. dizesinde 123,456.00binlik ayırıcısı gibi virgül ayırıcılarına izin verilmez.

Para veyaküçük ağ veri türlerine dönüştürülen karakter ifadeleri isteğe bağlı ondalık ayırıcı ve dolar işareti ($) de içerebilir. içinde olduğu gibi $123,456.00virgül ayırıcılarına izin verilir.

Boş bir dize int'e dönüştürüldüğünde değeri olur 0. Boş bir dize bir tarihe dönüştürüldüğünde değeri tarih olur( olan 1900-01-01).

Examples

A. Değişken bildiriminde kullanıldığında varsayılan n değerini göster

Aşağıdaki örnekte, değişken bildiriminde kullanıldığında karakter ve varchar veri türleri için varsayılan n değeri 1'dir.

DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';

--The following query returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO

B. Varchar CAST ve CONVERT ile kullanıldığında varsayılan n değerini göster

Aşağıdaki örnekte, ve işlevleriyle birlikte karakter veya CAST veri türleri kullanıldığında n değerinin varsayılan değerinin CONVERT 30 olduğu gösterilmektedir.

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. Verileri görüntüleme amacıyla dönüştürme

Aşağıdaki örnek, iki sütunu karakter türlerine dönüştürür ve görüntülenen verilere belirli bir biçim uygulayan bir stil uygular. Para türü karakter verilerine dönüştürülür ve değerleri ondalık noktasının solundaki her üç basamakta bir virgülle ve ondalık noktasının sağındaki iki basamakla gösteren stil 1 uygulanır. Tarih saat türü karakter verilerine dönüştürülür ve stil 3 uygulanır ve bu da verileri biçiminde dd/mm/yygörüntüler. yan tümcesinde WHERE , bir dize karşılaştırma işlemi gerçekleştirmek için para türü bir karakter türüne dönüştürülür.

USE AdventureWorks2022;
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%';

Sonuç kümesi aşağıdadır.

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 verilerini dönüştürme

Aşağıdaki örnek bir benzersizleştirici değerini bir char veri türüne dönüştürür.

DECLARE @myid UNIQUEIDENTIFIER = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';

Aşağıdaki örnek, değer dönüştürülen veri türü için çok uzun olduğunda verilerin kesilmesini gösterir. Uniqueidentifier türü 36 karakterle sınırlı olduğundan, bu uzunluğu aşan karakterler kesilir.

DECLARE @ID NVARCHAR(MAX) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(UNIQUEIDENTIFIER, @ID) AS TruncatedValue;

Sonuç kümesi aşağıdadır.

String                                     TruncatedValue
------------------------------------------ ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong  0E984725-C51C-4BF4-9960-E1C80E27ABA0