Udostępnij za pomocą


char i varchar (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Typy danych znaków, które są stałym rozmiarem, znakiem lub zmiennym rozmiarem, varchar. Począwszy od programu SQL Server 2019 (15.x), gdy jest używane sortowanie z włączoną obsługą protokołu UTF-8, te typy danych przechowują pełny zakres danych znaków Unicode i używają kodowania znaków UTF-8 . Jeśli określono sortowanie inne niż UTF-8, te typy danych przechowują tylko podzbiór znaków obsługiwany przez odpowiednią stronę kodową tego sortowania.

Arguments

char [ ( n ) ]

Dane ciągów o stałym rozmiarze. n definiuje rozmiar ciągu w bajtach i musi być wartością z zakresu od 1 do 8000. W przypadku zestawów znaków kodowania jednobajtowego, takich jak Latin, rozmiar magazynu to n bajtów, a liczba znaków, które można przechowywać, również n. W przypadku zestawów znaków kodowania wielobajtowego rozmiar magazynu jest nadal n bajtów, ale liczba znaków, które mogą być przechowywane, może być mniejsza niż n. Synonim ISO dla znaku to znak. Aby uzyskać więcej informacji na temat zestawów znaków, zobacz Single-Byte i zestawy znaków wielobajtowych.

varchar [ ( n | max ) ]

Dane ciągów o zmiennym rozmiarze. Użyj n , aby zdefiniować rozmiar ciągu w bajtach i może być wartością z zakresu od 1 do 8000 lub użyć wartości maksymalnej , aby wskazać maksymalny rozmiar ograniczenia kolumny do maksymalnego miejsca do magazynowania 2^31–1 bajtów (2 GB) lub 1 MB w magazynie danych sieci szkieletowej. W przypadku zestawów znaków kodowania jednobajtowego, takich jak Latin, rozmiar magazynu to n bajtów + 2 bajty, a liczba znaków, które mogą być przechowywane, również n. W przypadku zestawów znaków kodowania wielobajtowego rozmiar magazynu nadal wynosi n bajtów + 2 bajty, ale liczba znaków, które mogą być przechowywane, może być mniejsza niż n. Synonimy ISO dla zmiennej varchar różnią się znakami lub różnią się znakami. Aby uzyskać więcej informacji na temat zestawów znaków, zobacz Single-Byte i zestawy znaków wielobajtowych.

Remarks

Typowym błędem jest myślenie, że z char(n) i varchar(n), n definiuje liczbę znaków. Jednak w znakach (n) i varchar(n)n definiuje długość ciągu w bajtach (od 0 do 8000). n nigdy nie definiuje liczby znaków, które mogą być przechowywane. Ta koncepcja jest podobna do definicji nchar i nvarchar.

Błędne przekonanie występuje, ponieważ w przypadku korzystania z kodowania jednobajtowego rozmiar magazynu znaków i varchar wynosi n bajtów, a liczba znaków również nie jest liczbą znaków. Jednak w przypadku kodowania wielobajtowego, takiego jak UTF-8, wyższe zakresy Unicode (od 128 do 114 1111) powodują jeden znak przy użyciu co najmniej dwóch bajtów. Na przykład w kolumnie zdefiniowanej jako char(10) aparat bazy danych może przechowywać 10 znaków, które używają kodowania jednobajtowego (zakres Unicode od 0 do 127), ale mniej niż 10 znaków podczas korzystania z kodowania wielobajtowego (zakres Unicode od 128 do 114 1111). Aby uzyskać więcej informacji na temat magazynu i zakresów znaków Unicode, zobacz Różnice magazynu między utF-8 i UTF-16.

Jeśli n nie jest określona w instrukcji definicji danych lub deklaracji zmiennej, domyślna długość to 1. Jeśli n nie zostanie określony podczas korzystania z CAST funkcji i CONVERT , domyślna długość to 30.

Obiekty używające znaku lub varchar są przypisywane domyślne sortowanie bazy danych, chyba że określone sortowanie jest przypisane przy użyciu klauzuli COLLATE . Sortowanie kontroluje stronę kodów używaną do przechowywania danych znaków.

Kodowanie wielobajtowe w programie SQL Server obejmują:

  • Zestawy znaków dwubajtowych (DBCS) dla niektórych języków wschodnioazjatyckich przy użyciu stron kodowych 936 i 950 (chiński), 932 (japoński) lub 949 (koreański).

  • UTF-8 ze stroną kodową 65001.

    Dotyczy: SQL Server 2019 (15.x) i nowsze wersje.

Jeśli masz witryny, które obsługują wiele języków:

  • Począwszy od programu SQL Server 2019 (15.x), rozważ użycie sortowania z włączoną funkcją UTF-8 w celu obsługi formatu Unicode i zminimalizowania problemów z konwersją znaków.
  • Jeśli używasz poprzedniej wersji aparatu bazy danych programu SQL Server, rozważ użycie typów danych Unicode nchar lub nvarchar w celu zminimalizowania problemów z konwersją znaków.

Jeśli używasz znaku lub varchar, zalecamy:

  • Użyj znaku , gdy rozmiary wpisów danych kolumny są spójne.
  • Użyj zmiennej varchar , gdy rozmiary wpisów danych kolumny różnią się znacznie.
  • Użyj zmiennej varchar(max), gdy rozmiary wpisów danych kolumny różnią się znacznie, a długość ciągu może przekraczać 8000 bajtów.

Jeśli SET ANSI_PADDING wartość jest OFF wykonywana CREATE TABLE lub ALTER TABLE jest wykonywana, kolumna char zdefiniowana jako NULL jest obsługiwana jako varchar.

Warning

Każda kolumna varchar(max) lub nvarchar(max) wymaga 24 bajtów dodatkowej stałej alokacji, która jest liczone względem limitu wierszy 8060 bajtów podczas operacji sortowania. Może to spowodować utworzenie niejawnego limitu liczby kolumn varchar(max) lub nvarchar(max), które można utworzyć w tabeli.

Nie podano żadnego specjalnego błędu podczas tworzenia tabeli (poza zwykłym ostrzeżeniem, że maksymalny rozmiar wiersza przekracza dozwoloną maksymalną liczbę 8060 bajtów) lub w momencie wstawiania danych. Ten duży rozmiar wiersza może powodować błędy (takie jak błąd 512) podczas niektórych normalnych operacji, takich jak aktualizacja klucza indeksu klastrowanego lub rodzaj pełnego zestawu kolumn, które będą występować tylko podczas wykonywania operacji.

Konwertowanie danych znaków

Gdy wyrażenia znaków są konwertowane na typ danych znaków o innym rozmiarze, wartości, które są zbyt długie dla nowego typu danych, są obcinane. Typ uniqueidentifier jest uważany za typ znaku na potrzeby konwersji z wyrażenia znaku, dlatego podlega regułom obcinania konwersji na typ znaku. Zobacz sekcję Przykłady .

Gdy wyrażenie znaku jest konwertowane na wyrażenie znaków innego typu danych lub rozmiaru, na przykład z char(5) na varchar(5), lub char(20) na char(15), sortowanie wartości wejściowej jest przypisywane do przekonwertowanej wartości. Jeśli wyrażenie noncharacter jest konwertowane na typ danych znaków, domyślne sortowanie bieżącej bazy danych jest przypisywane do przekonwertowanej wartości. W obu przypadkach można przypisać określone sortowanie przy użyciu klauzuli COLLATE .

Note

Tłumaczenia stron kodowych są obsługiwane w przypadku typów danych char i varchar , ale nie dla typu danych tekstowych . Podobnie jak w przypadku wcześniejszych wersji programu SQL Server, utrata danych podczas translacji stron kodu nie jest zgłaszana.

Wyrażenia znaków, które są konwertowane na przybliżony typ danych liczbowych , mogą zawierać opcjonalną notację wykładniczą. Ta notacja jest małą literą e lub wielką literą, po której następuje E opcjonalny znak plus (+) lub minus (-), a następnie numer.

Wyrażenia znaków, które są konwertowane na dokładny typ danych liczbowych , muszą składać się z cyfr, punktu dziesiętnego i opcjonalnego znaku plus (+) lub minus (-). Wiodące puste pusty są ignorowane. Separatory przecinków, takie jak separator tysięcy w elemecie 123,456.00, nie są dozwolone w ciągu.

Wyrażenia znaków konwertowane na pieniądze lub małe typy danych mogą również zawierać opcjonalny znak dziesiętny i znak dolara ($). Separatory przecinków, jak w pliku $123,456.00, są dozwolone.

Gdy pusty ciąg zostanie przekonwertowany na int, jego wartość staje się .0 Gdy pusty ciąg zostanie przekonwertowany na datę, jego wartość stanie się datą — czyli 1900-01-01.

Examples

A. Pokaż wartość domyślną n w przypadku użycia w deklaracji zmiennej

W poniższym przykładzie pokazano, że wartość domyślna n to 1 dla typów danych char ivarchar , które są używane w deklaracji zmiennej.

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

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

B. Pokaż wartość domyślną n , gdy varchar jest używany z funkcją CAST i KONWERTUJ

W poniższym przykładzie pokazano, że wartość domyślna n to 30, gdy typy danych char lubvarchar są używane z funkcjami CAST i CONVERT .

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. Konwertowanie danych na potrzeby wyświetlania

Poniższy przykład konwertuje dwie kolumny na typy znaków i stosuje styl, który stosuje określony format do wyświetlanych danych. Typ pieniędzy jest konwertowany na dane znaków i jest stosowany styl 1 , który wyświetla wartości z przecinkami co trzy cyfry po lewej stronie punktu dziesiętnego i dwie cyfry po prawej stronie przecinka dziesiętnego. Typ daty/godziny jest konwertowany na dane znaków i jest stosowany styl 3 , który wyświetla dane w formacie dd/mm/yy. W klauzuli WHERE typ pieniędzy jest rzutowy do typu znaku, aby wykonać operację porównania ciągów.

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

Oto zestaw wyników.

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. Konwertowanie unikatowych danychidentyfikatora

Poniższy przykład konwertuje unikatową wartośćidentyfikatora na typ danych char .

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

W poniższym przykładzie pokazano obcięcie danych, gdy wartość jest zbyt długa dla typu danych konwertowanego na. Ponieważ typ uniqueidentifier jest ograniczony do 36 znaków, znaki, które przekraczają długość, są obcinane.

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

Oto zestaw wyników.

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