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

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)

Символьные типы данных имеют фиксированный (char) или переменный (varchar) размер. Начиная с SQL Server 2019 (15.x) при использовании параметров сортировки с поддержкой UTF-8 эти типы данных хранят весь диапазон символьных данных Юникод и используют кодировку UTF-8. Если указаны параметры сортировки без поддержки UTF-8, эти типы данных хранят только подмножество символьных данных, поддерживаемых соответствующей кодовой страницей указанных параметров сортировки.

Аргументы

char [ ( n ) ]

Строковые данные фиксированного размера. n определяет размер строки в байтах и должно иметь значение от 1 до 8000. Для однобайтовых кодировки наборов символов, таких как Latin, размер хранилища равен n байтам, а количество символов, которые могут храниться, также равно n. Для многобайтовых кодировок размер при хранения тоже равен n байт, но количество хранимых символов может быть меньше n. Синонимом по стандарту ISO для типа char является character. Дополнительные сведения о кодировках см. в статье Однобайтовые и многобайтовые кодировки.

varchar [ ( n | max ) ]

Строковые данные переменного размера. Используйте n , чтобы определить размер строки в байтах и может быть значением от 1 до 8000, или используйте max , чтобы указать размер ограничения столбца до максимального размера хранилища в 2^31–1 байт (2 ГБ). Для однобайтовых наборов символов, таких как Latin, размер хранилища составляет n байт + 2 байта, а количество символов, которые можно сохранить, также равно n. Для многобайтовых кодировки размер хранилища по-прежнему составляет n байтов + 2 байта, но количество символов, которые могут быть сохранены, может быть меньше n. Синонимами по стандарту ISO для типа varchar являются типы charvarying или charactervarying. Дополнительные сведения о кодировках см. в статье Однобайтовые и многобайтовые кодировки.

Remarks

Распространенное заблуждение заключается в том, что при использовании char(n) и varchar(n)n определяет количество символов. Однако в char(n) и varchar(n)n определяет длину строки в байтах (от 0 до 8000). n никогда не определяет количество хранимых символов. Это аналогично определению nchar(n) и nvarchar(n).

Неправильное представление происходит из-за того, что при использовании однобайтового кодирования размер хранилища char и varchar составляет n байтов, а число символов также равно n. Однако для многобайтового кодирования, например UTF-8, более высокие диапазоны Юникода (от 128 до 1 114 111) приводят к использованию одного символа с использованием двух или более байтов. Например, в столбце, определенном как char(10), ядро СУБД может хранить 10 символов, использующих однобайтовую кодировку (диапазон Юникода от 0 до 127), но менее 10 символов при использовании многобайтовой кодировки (диапазон Юникода от 128 до 114 111). Дополнительные сведения о хранении символов Юникода и их диапазонах см. в разделе Различия в хранении UTF-8 и UTF-16.

Если значение n в определении данных или инструкции объявления переменной не указано, длина по умолчанию равна 1. Если n не указан при использовании CAST функций и CONVERT , длина по умолчанию составляет 30.

Объектам, использующим char или varchar , назначаются параметры сортировки по умолчанию для базы данных, если только определенные параметры сортировки не назначены с помощью COLLATE предложения . Параметры сортировки контролируют кодовую страницу, используемую для хранения символьных данных.

Многобайтовые кодировки в SQL Server включают следующие:

  • двухбайтовые кодировки (DBCS) для некоторых языков Восточной Азии, использующих кодовые страницы 936 и 950 (китайский), 932 (японский) или 949 (корейский).

  • UTF-8 с кодовой страницей 65001.

    Область применения: SQL Server 2019 (15.x) и более поздних версий.

Если у вас есть сайты, поддерживающие несколько языков, примите к сведению следующие рекомендации:

  • Для поддержки Юникода и минимизации проблем с преобразованием символов рекомендуем использовать параметры сортировки с поддержкой UTF-8 (начиная с SQL Server 2019 (15.x)).
  • При использовании предыдущей версии ядра СУБД SQL Server рекомендуется использовать типы данных Юникод nchar или nvarchar, чтобы свести к минимуму проблемы с преобразованием символов.

При использовании char или varchar рекомендуется:

  • Если размеры записей данных столбцов постоянны, используйте char.
  • Если размеры записей данных столбцов значительно изменяются, используйте varchar.
  • использовать varchar(max) , если размеры записей данных в столбцах существенно отличаются и длина строки может превышать 8000 байт.

Если SET ANSI_PADDING параметр имеет значение OFF при выполнении или CREATE TABLEALTER TABLE , столбец char , определенный как NULL, обрабатывается как varchar.

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

Для каждого ненулевого столбца varchar(max) или nvarchar(max) требуется 24 байта дополнительного фиксированного выделения, что учитывается в 8060 байтах строки во время операции сортировки. Это может создать неявное ограничение на количество ненулевых столбцов varchar(max) или nvarchar(max), которые могут быть созданы в таблице.

При создании таблицы или во время вставки данных не возникает особых ошибок (кроме обычного предупреждения о том, что максимальный размер строки превышает максимально допустимое значение в 8060 байт). Такой размер строки может вызывать ошибки (например, ошибку 512) во время некоторых обычных операций, таких как обновление ключа кластеризованного индекса, или сортировки полного набора столбцов, которая происходит только во время выполнения операции.

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

При преобразовании символьного выражения в символьный тип данных другой длины значения, слишком длинные для нового типа данных, усекаются. Тип uniqueidentifier считается символьным типом, используемым при преобразовании из символьного выражения, поэтому на него распространяются правила усечения при преобразовании в символьный тип. См. раздел Примеры .

Если символьное выражение преобразуется в символьное выражение другого типа данных или размера, например из char(5) в varchar(5) или из char(20) в char(15) , то преобразованному значению присваиваются параметры сортировки входного значения. Если несимвольное выражение преобразуется в символьный тип данных, то преобразованному значению присваиваются параметры сортировки, заданные по умолчанию в текущей базе данных. В любом случае необходимые параметры сортировки можно присвоить с помощью предложения COLLATE.

Примечание

Переводы кодовых страниц поддерживаются для типов данных char и varchar , но не для текстовых типов данных. Как и в ранних версиях SQL Server, о потере данных во время преобразования кодовых страниц не сообщается.

Символьные выражения, которые преобразуются в приближенный тип данных numeric, могут содержать необязательную экспоненциальную нотацию Эта нотация представляет собой строчную e или прописную E букву, за которой следует необязательный знак плюс (+) или минус (-), а затем число.

Символьные выражения, преобразуемые в точный числовой тип данных, должны состоять из цифр, десятичной запятой и необязательного знака "плюс" (+) или "минус" (-). Начальные пробелы не учитываются. Разделители запятой, такие как разделитель разрядов в 123,456.00, не допускаются в строке.

Символьные выражения, преобразуемые в типы данных money или smallmoney , также могут включать необязательную десятичную запятую и знак доллара ($). Разделители запятой, как в $123,456.00, разрешены.

Когда пустая строка преобразуется в int, ее значение становится 0. Когда пустая строка преобразовывается в дату, ее значением становится значение даты по умолчанию, то есть 1900-01-01.

Примеры

A. Отображение значения по умолчанию n при использовании в объявлении переменной

В следующем примере показано, что значение n по умолчанию равно 1 для типов данных char и varchar , если они используются в объявлении переменной.

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

Б. Отображение значения по умолчанию n при использовании varchar с CAST и CONVERT

В следующем примере показано, что значение по умолчанию n равно 30, если типы данных char или varchar используются с функциями CAST и 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';

В. Преобразование данных для отображения

В следующем примере два столбца преобразуются в символьные типы, после чего к ним применяется стиль, применяющий к отображаемым данным конкретный формат. Тип 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

Г. Преобразование данных uniqueidentifer

В следующем примере значение 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)

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