Типы char и varchar (Transact-SQL)char and varchar (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Символьные типы данных имеют фиксированный (char) или переменный (varchar) размер.Character data types that are either fixed-size, char, or variable-size, varchar. Начиная с SQL Server 2019 (15.x)SQL Server 2019 (15.x) при использовании параметров сортировки с поддержкой UTF-8 эти типы данных хранят весь диапазон символьных данных Юникод и используют кодировку UTF-8.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), when a UTF-8 enabled collation is used, these data types store the full range of Unicode character data and use the UTF-8 character encoding. Если указаны параметры сортировки без поддержки UTF-8, эти типы данных хранят только подмножество символьных данных, поддерживаемых соответствующей кодовой страницей указанных параметров сортировки.If a non-UTF-8 collation is specified, then these data types store only a subset of characters supported by the corresponding code page of that collation.

АргументыArguments

char [ ( n ) ] — строковые данные фиксированного размера. char [ ( n ) ] Fixed-size string data. n определяет размер строки в байтах и должно иметь значение от 1 до 8000. n defines the string size in bytes and must be a value from 1 through 8,000. Для однобайтовых кодировок, таких как Latin, размер при хранении равен n байт, а количество хранимых символов — тоже n.For single-byte encoding character sets such as Latin, the storage size is n bytes and the number of characters that can be stored is also n. Для многобайтовых кодировок размер при хранения тоже равен n байт, но количество хранимых символов может быть меньше n.For multibyte encoding character sets, the storage size is still n bytes but the number of characters that can be stored may be smaller than n. Синонимом по стандарту ISO для типа char является character.The ISO synonym for char is character. Дополнительные сведения о кодировках см. в статье Однобайтовые и многобайтовые кодировки.For more information on character sets, see Single-Byte and Multibyte Character Sets.

varchar [ ( n | max ) ] — строковые данные переменного размера. varchar [ ( n max ) ] Variable-size string data. Используйте значение n для определения размера строки в байтах (допускаются значения от 1 до 8000) или используйте max для указания предельного размера столбца вплоть до максимального размера хранилища, что составляет 2^31-1 байт (2 ГБ).Use n to define the string size in bytes and can be a value from 1 through 8,000 or use max to indicate a column constraint size up to a maximum storage of 2^31-1 bytes (2 GB). Для однобайтовых кодировок, таких как Latin, размер при хранении равен n байт + 2 байта, а количество хранимых символов — n.For single-byte encoding character sets such as Latin, the storage size is n bytes + 2 bytes and the number of characters that can be stored is also n. Для многобайтовых кодировок размер при хранении тоже равен n байт + 2 байта, но количество хранимых символов может быть меньше n.For multi-byte encoding character sets, the storage size is still n bytes + 2 bytes but the number of characters that can be stored may be smaller than n. Синонимами по стандарту ISO для типа varchar являются типы charvarying или charactervarying.The ISO synonyms for varchar are charvarying or charactervarying. Дополнительные сведения о кодировках см. в статье Однобайтовые и многобайтовые кодировки.For more information on character sets, see Single-Byte and Multibyte Character Sets.

RemarksRemarks

Часто ошибочно считают, что в типах данных CHAR(n) и VARCHAR(n) число n указывает на количество символов.A common misconception is to think that CHAR(n) and VARCHAR(n), the n defines the number of characters. Однако на самом деле число n в CHAR(n) и VARCHAR(n) — это длина строки в байтах (0–8000).But in CHAR(n) and VARCHAR(n) the n defines the string length in bytes (0-8,000). n никогда не определяет количество хранимых символов. n never defines numbers of characters that can be stored. То же самое верно и в отношении типов NCHAR(n) и NVARCHAR(n).This is similar to the definition of NCHAR(n) and NVARCHAR(n). Причина этого заблуждения в том, что при использовании однобайтовых кодировок размер данных типов CHAR и VARCHAR при хранении равен n байт, а количество символов — тоже n.The misconception happens because when using single-byte encoding, the storage size of CHAR and VARCHAR is n bytes and the number of characters is also n. Однако в случае с многобайтовыми кодировками, такими как UTF-8, в старших диапазонах Юникода (128–1 114 111) один символ занимает два или несколько байтов.However, for multi-byte encoding such as UTF-8, higher Unicode ranges (128-1,114,111) result in one character using two or more bytes. Например, в столбце, определенном как CHAR(10), Компонент Database EngineDatabase Engine может хранить 10 символов, использующих однобайтовую кодировку (диапазон Юникода 0–127), но меньше 10 символов при использовании многобайтовой кодировки (диапазон Юникода 128–1 114 111).For example, in a column defined as CHAR(10), the Компонент Database EngineDatabase Engine can store 10 characters that use single-byte encoding (Unicode range 0-127), but less than 10 characters when using multi-byte encoding (Unicode range 128-1,114,111). Дополнительные сведения о хранении символов Юникода и их диапазонах см. в разделе Различия в хранении UTF-8 и UTF-16.For more information about Unicode storage and character ranges, see Storage differences between UTF-8 and UTF-16.

Если значение n в определении данных или инструкции объявления переменной не указано, длина по умолчанию равна 1.When n isn't specified in a data definition or variable declaration statement, the default length is 1. Если значение n не указано при использовании функций CAST и CONVERT, длина по умолчанию равна 30.If n isn't specified when using the CAST and CONVERT functions, the default length is 30.

Объектам, в которых используются типы данных char и varchar, назначаются параметры сортировки базы данных по умолчанию, если только иные параметры сортировки не назначены с использованием предложения COLLATE.Objects that use char or varchar are assigned the default collation of the database, unless a specific collation is assigned using the COLLATE clause. Параметры сортировки контролируют кодовую страницу, используемую для хранения символьных данных.The collation controls the code page that is used to store the character data.

В SQL ServerSQL Server многобайтовые кодировки включают:Multibyte encodings in SQL ServerSQL Server include:

  • двухбайтовые кодировки (DBCS) для некоторых языков Восточной Азии, использующих кодовые страницы 936 и 950 (китайский), 932 (японский) или 949 (корейский).Double-byte character sets (DBCS) for some East Asian languages using code pages 936 and 950 (Chinese), 932 (Japanese), or 949 (Korean).
  • UTF-8 с кодовой страницей 65001.UTF-8 with code page 65001. Применимо к: SQL ServerSQL Server (начиная с SQL Server 2019 (15.x)SQL Server 2019 (15.x)) Applies to: (starting with )

Если у вас есть сайты, поддерживающие несколько языков, примите к сведению следующие рекомендации:If you have sites that support multiple languages:

  • Для поддержки Юникода и минимизации проблем с преобразованием символов рекомендуем использовать параметры сортировки с поддержкой UTF-8 (начиная с SQL Server 2019 (15.x)SQL Server 2019 (15.x)).Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), consider using a UTF-8 enabled collation to support Unicode and minimize character conversion issues.
  • Если используется более ранняя версия Компонент SQL Server Database EngineSQL Server Database Engine, то чтобы избежать проблем с преобразованием символов, рекомендуем использовать типы данных Юникода nchar или nvarchar.If using a lower version of the Компонент SQL Server Database EngineSQL Server Database Engine, consider using the Unicode nchar or nvarchar data types to minimize character conversion issues.

Если вы используете char или varchar, мы рекомендуем:If you use char or varchar, we recommend to:

  • Если размеры записей данных столбцов постоянны, используйте char.Use char when the sizes of the column data entries are consistent.
  • Если размеры записей данных столбцов значительно изменяются, используйте varchar.Use varchar when the sizes of the column data entries vary considerably.
  • использовать varchar(max) , если размеры записей данных в столбцах существенно отличаются и длина строки может превышать 8000 байт.Use varchar(max) when the sizes of the column data entries vary considerably, and the string length might exceed 8,000 bytes.

Если SET ANSI_PADDING равно OFF при выполнении CREATE TABLE или ALTER TABLE, столбец char, определенный как NULL, обрабатывается как varchar.If SET ANSI_PADDING is OFF when either CREATE TABLE or ALTER TABLE is executed, a char column that is defined as NULL is handled as varchar.

Предупреждение

Для каждого ненулевого столбца varchar(max) или nvarchar(max) требуется 24 байта дополнительного фиксированного выделения, которые учитываются в максимальном размере строки в 8060 байт во время операции сортировки.Each non-null varchar(max) or nvarchar(max) column requires 24 bytes of additional fixed allocation which counts against the 8,060 byte row limit during a sort operation. Это может создать неявное ограничение в ряде ненулевых столбцов varchar(max) или nvarchar(max), которые могут быть созданы в таблице.This can create an implicit limit to the number of non-null varchar(max) or nvarchar(max) columns that can be created in a table. При создании таблицы или во время вставки данных не возникает особых ошибок (кроме обычного предупреждения о том, что максимальный размер строки превышает максимально допустимое значение в 8060 байт).No special error is provided when the table is created (beyond the usual warning that the maximum row size exceeds the allowed maximum of 8,060 bytes) or at the time of data insertion. Такой размер строки может вызывать ошибки (например, ошибку 512) во время некоторых обычных операций, таких как обновление ключа кластеризованного индекса, или сортировки полного набора столбцов, которая происходит только во время выполнения операции.This large row size can cause errors (such as error 512) during some normal operations, such as a clustered index key update, or sorts of the full column set, which will only occur while performing an operation.

Преобразование символьных данныхConverting Character Data

При преобразовании символьного выражения в символьный тип данных другой длины значения, слишком длинные для нового типа данных, усекаются.When character expressions are converted to a character data type of a different size, values that are too long for the new data type are truncated. Тип uniqueidentifier считается символьным типом, используемым при преобразовании из символьного выражения, поэтому на него распространяются правила усечения при преобразовании в символьный тип.The uniqueidentifier type is considered a character type for the purposes of conversion from a character expression, and so is subject to the truncation rules for converting to a character type. См подраздел «Примеры» ниже.See the Examples section that follows.

Если символьное выражение преобразуется в символьное выражение другого типа данных или размера, например из char(5) в varchar(5) или из char(20) в char(15) , то преобразованному значению присваиваются параметры сортировки входного значения.When a character expression is converted to a character expression of a different data type or size, such as from char(5) to varchar(5), or char(20) to char(15), the collation of the input value is assigned to the converted value. Если несимвольное выражение преобразуется в символьный тип данных, то преобразованному значению присваиваются параметры сортировки, заданные по умолчанию в текущей базе данных.If a noncharacter expression is converted to a character data type, the default collation of the current database is assigned to the converted value. В любом случае необходимые параметры сортировки можно присвоить с помощью предложения COLLATE.In either case, you can assign a specific collation by using the COLLATE clause.

Примечание

Преобразование кодовых страниц поддерживается для типов данных char и varchar, однако поддержка типа данных text не предусмотрена.Code page translations are supported for char and varchar data types, but not for text data type. Как и в ранних версиях SQL ServerSQL Server, о потере данных во время преобразования кодовых страниц не сообщается.As with earlier versions of SQL ServerSQL Server, data loss during code page translations isn't reported.

Символьные выражения, которые преобразуются в приближенный тип данных numeric, могут содержать необязательную экспоненциальную нотациюCharacter expressions that are being converted to an approximate numeric data type can include optional exponential notation. (символ e нижнего регистра или E верхнего регистра, за которым следуют необязательный знак плюс (+) или минус (–) и число).This notation is a lowercase e or uppercase E followed by an optional plus (+) or minus (-) sign and then a number.

Символьные выражения, преобразуемые в точный тип данных numeric, должны состоять из цифр, десятичного разделителя и необязательного знака плюс (+) или минус (–).Character expressions that are being converted to an exact numeric data type must consist of digits, a decimal point, and an optional plus (+) or minus (-). Начальные пробелы не учитываются.Leading blanks are ignored. Разделители в виде запятой запрещены (например, десятичный разделитель в числе 123 456,00).Comma separators, such as the thousands separator in 123,456.00, aren't allowed in the string.

Кроме того, символьные выражения, преобразуемые в типы данных money или smallmoney, могут содержать необязательный десятичный разделитель и обозначение валюты.Character expressions being converted to money or smallmoney data types can also include an optional decimal point and dollar sign ($). Разрешаются разделители в виде запятой, например 123 456,00 руб.Comma separators, as in $123,456.00, are allowed.

Когда пустая строка преобразовывается в тип int, ее значение становится равным 0.When an empty string get converted to an int, its value becomes 0. Когда пустая строка преобразовывается в дату, ее значением становится значение даты по умолчанию, то есть 1900-01-01.When an empty string gets converted to a date, its value becomes the default value for date - which is 1900-01-01.

ПримерыExamples

A.A. Отображение значения по умолчанию n при использовании в объявлении переменнойShowing the default value of n when used in variable declaration.

В приведенном ниже примере показано, что значение по умолчанию n равно 1 для типов данных char и varchar, если они используются в объявлении переменной.The following example shows the default value of n is 1 for the char and varchar data types when they are used in variable declaration.

DECLARE @myVariable AS varchar = 'abc';
DECLARE @myNextVariable AS char = 'abc';
--The following returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO

Б.B. Отображение значения по умолчанию n при использовании функций CAST и CONVERT с типом данных varcharShowing the default value of n when varchar is used with CAST and CONVERT.

В приведенном ниже примере показано, что значение по умолчанию n равно 30, если типы данных char или varchar используются с функциями CAST и CONVERT.The following example shows that the default value of n is 30 when the char or varchar data types are used with the CAST and CONVERT functions.

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. Преобразование данных для отображенияConverting Data for Display Purposes

В следующем примере два столбца преобразуются в символьные типы, после чего к ним применяется стиль, применяющий к отображаемым данным конкретный формат.The following example converts two columns to character types and applies a style that applies a specific format to the displayed data. Тип money преобразуется в символьные данные. К нему применяется стиль 1, отображающий значения с запятыми между каждой группой из трех цифр, отсчитывая влево от десятичной точи, и каждой группой из двух цифр, отсчитывая вправо от десятичной точки.A money type is converted to character data and style 1 is applied, which displays the values with commas every three digits to the left of the decimal point, and two digits to the right of the decimal point. Тип datetime преобразуется в символьные данные. К нему применяется стиль 3, отображающий данные в формате дд/мм/гг.A datetime type is converted to character data and style 3 is applied, which displays the data in the format dd/mm/yy. В предложении WHERE тип money приводится к символьному типу для выполнения операции сравнения строк.In the WHERE clause, a money type is cast to a character type to perform a string comparison operation.

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

Результирующий набор:Here is the result set.

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. Преобразование данных uniqueidentifierConverting Uniqueidentifer Data

В следующем примере значение uniqueidentifier преобразуется в тип данных char.The following example converts a uniqueidentifier value to a char data type.

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

Следующий пример показывает усечение данных, когда значение является слишком длинным для преобразования в заданный тип данных.The following example demonstrates the truncation of data when the value is too long for the data type being converted to. Так как тип данных uniqueidentifier ограничен 36 символами, все символы, выходящие за пределы этой длины, будут усечены.Because the uniqueidentifier type is limited to 36 characters, the characters that exceed that length are truncated.

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;

Результирующий набор:Here is the result set.

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

(1 row(s) affected)

См. также разделSee also

nchar и nvarchar (Transact-SQL) CAST и CONVERT (Transact-SQL) COLLATE (Transact-SQL) Преобразование типа данных (ядро СУБД) Типы данных (Transact-SQL) Оценка размера базы данных Поддержка параметров сортировки и Юникода Однобайтовые и многобайтовые кодировкиnchar and nvarchar (Transact-SQL) CAST and CONVERT (Transact-SQL) COLLATE (Transact-SQL) Data Type Conversion (Database Engine) Data Types (Transact-SQL) Estimate the Size of a Database Collation and Unicode Support Single-Byte and Multibyte Character Sets