Ответ 1
Из MSDN:
varchar [(n | max)]
Строковые данные с переменной длиной, не-Юникодом. n определяет длину строки и может быть значением от 1 до 8000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байта (2 ГБ). Размер хранилища - это фактическая длина введенных данных + 2 байта.
nvarchar [(n | max)]
Строковые данные с переменной длиной Unicode. n определяет длину строки и может быть значением от 1 до 4000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байта (2 ГБ). Размер памяти в байтах в два раза превышает фактическую длину введенных данных + 2 байта.
и
Каждый столбец не нуль varchar (max) или nvarchar (max) требует 24 байтов дополнительного фиксированного распределения, которое рассчитывается против предела строки в 8,060 байт во время операции сортировки,
Чтобы проверить размер сохраненных данных, вы можете использовать DATALENGTH
Возвращает количество байтов, используемых для представления любого выражения.
Вы можете выполнить этот простой тест, чтобы проверить длину и укусы, используемые для хранения данных varchar
и nvarchar
:
CREATE TABLE #temp (
id int IDENTITY(1,1) NOT NULL,
vColumn varchar(1000) NULL,
nvColumn nvarchar(1000) NULL
)
INSERT INTO #temp VALUES
('something',N'something'),
('more','more'),
('',''),
('Autem excepturi omnis neque doloribus dolore. Saepe deleniti optio non ratione nesciunt esse ducimus. Nulla quia voluptatem aliquid omnis ex deleniti. Rerum minima unde officia est voluptatum esse dolorem aut. Sed est voluptas laboriosam. Dolore sint necessitatibus architecto sit eius ut molestiae eum.Sit sunt in dolores nihil. Numquam et nihil quo vel iusto. Commodi rem sint magnam qui perspiciatis. Accusantium sit adipisci neque. Nihil itaque quam quia. Est sapiente ut perferendis quia rerum. Quibusdam non et perferendis vel maxime est voluptates. Dolor deserunt qui iusto est. Et deleniti quia hic dicta ut quia. Dolore ducimus aspernatur quam nostrum commodi. Sequi cupiditate ipsa tempore. Velit dolorem eaque aspernatur sed numquam placeat excepturi odit. Accusantium officia sequi voluptas facilis ut eum necessitatibus id. Libero qui rerum et amet veniam architecto. Voluptatibus ad labore expedita. Mollitia ut soluta accusantium qui nam sunt nostrum. Aliquid aut voluptas accusamus v.',
N'Autem excepturi omnis neque doloribus dolore. Saepe deleniti optio non ratione nesciunt esse ducimus. Nulla quia voluptatem aliquid omnis ex deleniti. Rerum minima unde officia est voluptatum esse dolorem aut. Sed est voluptas laboriosam. Dolore sint necessitatibus architecto sit eius ut molestiae eum.Sit sunt in dolores nihil. Numquam et nihil quo vel iusto. Commodi rem sint magnam qui perspiciatis. Accusantium sit adipisci neque. Nihil itaque quam quia. Est sapiente ut perferendis quia rerum. Quibusdam non et perferendis vel maxime est voluptates. Dolor deserunt qui iusto est. Et deleniti quia hic dicta ut quia. Dolore ducimus aspernatur quam nostrum commodi. Sequi cupiditate ipsa tempore. Velit dolorem eaque aspernatur sed numquam placeat excepturi odit. Accusantium officia sequi voluptas facilis ut eum necessitatibus id. Libero qui rerum et amet veniam architecto. Voluptatibus ad labore expedita. Mollitia ut soluta accusantium qui nam sunt nostrum. Aliquid aut voluptas accusamus v.')
SELECT id,
vColumn,
LEN(vColumn) vLen,
DATALENGTH( vColumn) as vLength,
nvColumn,
LEN(nvColumn) nvLen,
DATALENGTH( nvColumn) as nvLength
FROM #temp
DROP TABLE #temp
Будет выводиться:
id vColumn vLen vLength nvColumn nvLen nvLength
1 something 9 9 something 9 18
2 more 4 4 more 4 8
3 0 0 0 0
4 Autem excepturis... 1000 1000 Autem excepturi... 1000 2000
В основном n
в вышеприведенных операторах определяется LENGTH (количество символов) строки.
DATALENGTH для nvarchar
в два раза больше, чем varchar
.