loading..
Русский    English
01:27
листать

CHAR и VARCHAR стр. 3

Рассмотрим следующий код.

  1. DECLARE @ch AS VARCHAR(2)='1';
  2. DECLARE @t TABLE(ch VARCHAR(2));
  3. INSERT INTO @t VALUES('123');
  4. SELECT @ch=CONCAT(@ch,'2','3');
  5. SELECT @ch "var",(SELECT ch FROM @t) "col";

var    col
12    NULL

В этом коде мы определяем простую переменную типа VARCHAR(2) и таблицу (табличную переменную) с единственным столбцом того же типа данных - VARCHAR(2).

В результате данные в переменной усекаются до требуемого размера - 2 символа, а при вставке в столбец таблицы значения, превышающего допустимый размер, возникает ошибка:

Символьные или двоичные данные могут быть усечены.

Этим объясняется результат - NULL в столбце col, т.е. данные не были вставлены в таблицу.

По поводу символьных данных следует сделать еще одно замечание, которое касается их допустимого размера.

Консоль
Выполнить
  1. SELECT LEN(REPLICATE('a',100000)) "varchar"
  2. ,LEN(REPLICATE(CAST('a' AS NVARCHAR),100000)) "nvarchar"
  3. ,LEN(REPLICATE(CAST('c' AS VARCHAR(MAX)),100000)) "varchar_max";

varchar    nvarchar    varchar_max
8000    4000    100000

Данный пример показывает, что простые символьные типы усекаются до размера страницы SQL Server - 8000 байтов (тип NVARCHARиспользует 2 байта на символ). Тип VARCHAR(MAX) позволяет хранить данные до 2Гб.

Это особенно следует иметь в виду при конкатенации данных, когда заранее трудно или невозможно узнать размер получаемой в результате строки, что может привести к неверному анализу данных:

Консоль
Выполнить
  1. SELECT LEN(CONCAT(REPLICATE('a', 7000), REPLICATE('b', 7000))) ch;

ch
8000

Здесь мы соединяем две строки по 7000 символов в каждой. В результате получаем строку размером 8000 символов, остальное отсекается без получения сообщения об ошибке.


Bookmark and Share
Страницы: 1 2 3
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
Перевозки из Швейцарии в Санкт-Петербург
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100