Sdílet prostřednictvím


char a varchar (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Datové typy znaků, které mají pevnou velikost, znak nebo proměnnou velikost, varchar. Počínaje SQL Serverem 2019 (15.x) při použití kolace s podporou UTF-8 ukládají tyto datové typy celý rozsah dat znaků Unicode a používají kódování znaků UTF-8 . Pokud je zadána kolace jiného typu než UTF-8, ukládají tyto datové typy pouze podmnožinu znaků podporovaných odpovídající znakovou stránkou této kolace.

Arguments

char [ ( n ) ]

Řetězcová data s pevnou velikostí n definuje velikost řetězce v bajtech a musí být hodnota od 1 do 8 000. Pro znakové sady kódování s jedním bajtem, například Latinvelikost úložiště je n bajtů a počet znaků, které lze uložit, je také n. U znakových sad kódování s vícebajty je velikost úložiště stále n bajtů, ale počet znaků, které lze uložit, může být menší než n. Synonymum ISO pro znak je znak. Další informace o znakových sadách najdete v tématu Single-Byte a vícebajtové znakové sady.

varchar [ ( n | max ) ]

Řetězcová data s proměnnou velikostí N slouží k definování velikosti řetězce v bajtech a může mít hodnotu od 1 do 8 000 nebo maximální velikost omezení sloupce až do maximální velikosti 2^31-1 bajtů (2 GB) nebo 1 MB v datovém skladu fabric. U znakových sad kódování s jedním bajtem, například Latinvelikost úložiště je n bajtů + 2 bajty a počet znaků, které lze uložit, je také n. U znakových sad kódování s vícebajty je velikost úložiště stále n bajtů + 2 bajty, ale počet znaků, které lze uložit, může být menší než n. Synonyma ISO pro varchar se liší nebo se liší. Další informace o znakových sadách najdete v tématu Single-Byte a vícebajtové znakové sady.

Remarks

Běžným omylem je myslet si, že s znakem (n) a varchar(n), n definuje počet znaků. V argumentu char(n) a varchar(n)však n definuje délku řetězce v bajtech (0 až 8 000). n nikdy nedefinuje počet znaků, které lze uložit. Tento koncept je podobný definici nchar a nvarchar.

K chybě dochází, protože při použití kódování s jedním bajtem je velikost úložiště znaku a varchar n bajtů a počet znaků je také n. U kódování s vícebajty, jako je UTF-8, ale vyšší rozsahy Unicode (128 až 1 114 111) mají za následek použití jednoho znaku pomocí dvou nebo více bajtů. Například ve sloupci definovaném jako char(10) může databázový stroj uložit 10 znaků, které používají kódování s jedním bajtem (rozsah Unicode 0 až 127), ale méně než 10 znaků při použití vícebajtového kódování (Kódování Unicode 128 až 1 114 111). Další informace o úložišti a rozsazích znaků Unicode najdete v tématu Rozdíly úložiště mezi UTF-8 a UTF-16.

Pokud n není zadán v definici dat nebo příkazu deklarace proměnné, výchozí délka je 1. Pokud není zadaná hodnota n při použití CAST funkcí a CONVERT funkcí, je výchozí délka 30.

Objekty používající znak nebo varchar jsou přiřazeny výchozí kolaci databáze, pokud není přiřazena konkrétní kolace pomocí COLLATE klauzule. Kolace řídí znakovou stránku, která se používá k ukládání dat znaků.

Mezi kódování s vícebajty v SQL Serveru patří:

  • Dvoubajtové znakové sady (DBCS) pro některé východoasijské jazyky používající znakové stránky 936 a 950 (čínština), 932 (japonština) nebo 949 (korejština).

  • UTF-8 s kódovou stránkou 65001.

    Platí pro: SQL Server 2019 (15.x) a novější verze

Pokud máte weby, které podporují více jazyků:

  • Počínaje SQL Serverem 2019 (15.x) zvažte použití kolace s podporou kódování UTF-8 pro podporu kódování Unicode a minimalizaci problémů s převodem znaků.
  • Pokud používáte předchozí verzi databázového stroje SQL Serveru, zvažte použití datových typů Unicode nchar nebo nvarchar k minimalizaci problémů s převodem znaků.

Pokud používáte znak nebo varchar, doporučujeme:

  • Znak použijte, pokud jsou velikosti položek dat sloupce konzistentní.
  • Varchar použijte, pokud se velikosti položek dat sloupce výrazně liší.
  • Pokud se velikosti položek dat sloupce výrazně liší, použijte varchar(max) a délka řetězce může překročit 8 000 bajtů.

Pokud SET ANSI_PADDING je OFF spuštěna CREATE TABLE nebo ALTER TABLE je spuštěna, je znakový sloupec, který je definován tak, jak NULL je zpracován jako varchar.

Warning

Každý sloupec bez hodnoty null varchar(max) nebo nvarchar(max) vyžaduje 24 bajtů dodatečného pevného přidělení, které se počítá s limitem 8 060 bajtů během operace řazení. To může vytvořit implicitní limit počtu sloupců, které nejsou null varchar(max) nebo nvarchar(max), které lze vytvořit v tabulce.

Při vytvoření tabulky (nad rámec obvyklého upozornění, že maximální velikost řádku překračuje povolenou maximální velikost 8 060 bajtů) nebo v okamžiku vložení dat není k dispozici žádná zvláštní chyba. Tato velká velikost řádku může způsobit chyby (například chyba 512) během některých běžných operací, například aktualizace clusterovaného indexového klíče nebo řazení celé sady sloupců, ke kterým dojde pouze při provádění operace.

Převod dat znaků

Pokud jsou výrazy znaků převedeny na datový typ znaku jiné velikosti, hodnoty, které jsou pro nový datový typ příliš dlouhé, jsou zkráceny. Typ uniqueidentifier je považován za typ znaku pro účely převodu z výrazu znaku, a proto podléhá pravidlům zkrácení pro převod na typ znaku. Viz část Příklady .

Při převodu znakového výrazu na znakový výraz jiného datového typu nebo velikosti, například z znaku (5) na varchar(5) nebo char(20) na znak(15) se kolace vstupní hodnoty přiřadí převedené hodnotě. Pokud je výraz noncharacter převeden na datový typ znaku, je výchozí kolace aktuální databáze přiřazena převedené hodnotě. V obou případech můžete přiřadit konkrétní kolaci pomocí klauzule COLLATE .

Note

Překlady znakových stránek jsou podporovány pro datové typy char a varchar , ale ne pro textový datový typ. Stejně jako u starších verzí SQL Serveru se ztráta dat během překladů znakových stránek neoznamuje.

Výrazy znaků, které se převádějí na přibližný číselný datový typ, můžou obsahovat volitelnou exponenciální notaci. Tento zápis je malými nebo velkými písmeny e následovanými volitelným znaménkem plus (E) nebo minus (+) a číslem.-

Výrazy znaků, které se převádějí na přesný číselný datový typ, musí obsahovat číslice, desetinnou čárku a volitelné plus (+) nebo minus (-). Úvodní prázdné hodnoty se ignorují. Oddělovače čárk, například oddělovač tisíců v 123,456.00řetězci, nejsou povoleny.

Výrazy znaků převedené na peníze nebo malé datové typy můžou obsahovat také volitelnou desetinnou čárku a znak dolaru ($). Jsou povoleny oddělovače čárk jako v $123,456.00.

Když se prázdný řetězec převede na int, jeho hodnota se stane 0. Když se prázdný řetězec převede na datum, stane se jeho hodnota datem , což je 1900-01-01.

Examples

A. Zobrazit výchozí hodnotu n při použití v deklaraci proměnné

Následující příklad ukazuje výchozí hodnotu n je 1 pro datové typy char a varchar při použití v deklaraci proměnné.

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

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

B. Zobrazí výchozí hodnotu n při použití varcharu s cast a CONVERT.

Následující příklad ukazuje, že výchozí hodnota n je 30, pokud jsou s datovými typy char nebo varchar použity s funkcemiCAST.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. Převod dat pro účely zobrazení

Následující příklad převede dva sloupce na typy znaků a použije styl, který použije určitý formát na zobrazená data. Typ peněz se převede na znaková data a styl 1 , který zobrazí hodnoty s čárkami nalevo od desetinné čárky a dvě číslice vpravo od desetinné čárky. Typ data a času se převede na znaková data a styl 3 , který zobrazí data ve formátu dd/mm/yy. V klauzuli WHERE je typ peněz přetypován na typ znaku k provedení operace porovnání řetězců.

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

Tady je soubor výsledků.

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. Převod dat uniqueidentifier

Následující příklad převede hodnotu uniqueidentifier na datový typ char .

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

Následující příklad ukazuje zkrácení dat, pokud je hodnota příliš dlouhá pro datový typ převeden na. Vzhledem k tomu, že typ uniqueidentifieru je omezen na 36 znaků, znaky, které přesahují délku, jsou zkráceny.

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

Tady je soubor výsledků.

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