Поделиться через


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

Являются символьными типами данных фиксированной или переменной длины.

  • char [ ( n ) ]
    Строковые данные фиксированной длины не в Юникоде. Аргумент n определяет длину строки и должен иметь значение от 1 до 8000. Размер при хранении составляет n байт. Синонимом по стандарту ISO для типа char является character.

  • varchar [ ( n | max ) ]
    Строковые данные переменной длины не в Юникоде. Аргумент n определяет длину строки и должен иметь значение от 1 до 8000. Значение max указывает, что максимальный размер при хранении составляет 2^31-1 байт (2 ГБ). Размер хранения — это фактическая длина введенных данных плюс 2 байта. Синонимами по стандарту ISO для типа varchar являются типы char varying или character varying.

Замечания

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

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

Если имеются сайты, поддерживающие несколько языков, то для уменьшения проблем, связанных с преобразованием символов, рассмотрите использование типов данных Юникода nchar или nvarchar. Если используется тип char или varchar, рекомендуется следующий подход.

  • Если размеры записей данных столбцов постоянны, используйте char.

  • Если размеры записей данных столбцов значительно изменяются, используйте varchar.

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

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

Если кодовая страница параметров сортировки использует двухбайтовые символы, размер хранения остается равным n байт. В зависимости от символьной строки для хранения n символов может понадобиться менее n байт.

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

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

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

ПримечаниеПримечание

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

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

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

Кроме того, символьные выражения, преобразуемые в типы данных money или smallmoney, могут содержать необязательный десятичный разделитель и обозначение валюты. Разрешаются разделители в виде запятой, например 123 456,00 руб.

Примеры

А.Отображение значения по умолчанию 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 при использовании функций CAST и CONVERT с типом данных varchar.

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

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

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

См. также

Справочник

nchar и nvarchar (Transact-SQL)

Функции CAST и CONVERT (Transact-SQL)

COLLATE (Transact-SQL)

Типы данных (Transact-SQL)

Основные понятия

Преобразование типов данных (компонент Database Engine)

Другие ресурсы

Оценка размера базы данных