我刚刚得知一个同事告诉我,如果你在数据库中为VARCHAR字段分配一个长度,例如VARCHAR(1000),那么数据库将强制每行保留1000字节的空间,无论是否需要。
然而,他声称一个NVARCHAR(1000)字段只会占用所需的字节数。
我已经尽力查找了这个问题,在这里和网络上都没有找到任何支持这一说法的内容,SQL Server帮助文档也没有提到这一点。
我刚刚得知一个同事告诉我,如果你在数据库中为VARCHAR字段分配一个长度,例如VARCHAR(1000),那么数据库将强制每行保留1000字节的空间,无论是否需要。
然而,他声称一个NVARCHAR(1000)字段只会占用所需的字节数。
我已经尽力查找了这个问题,在这里和网络上都没有找到任何支持这一说法的内容,SQL Server帮助文档也没有提到这一点。
根据 MSDN 文档:
varchar [ ( n | max ) ]
可变长度的非 Unicode字符串数据。n 定义了字符串长度,可以是 1 到 8,000 的值。max 表示最大存储大小为 2^31-1 字节(2 GB)。存储大小是实际输入数据的长度加上 2 字节。
nvarchar [ ( n | max ) ]
可变长度的Unicode字符串数据。n 定义了字符串长度,可以是 1 到 4,000 的值。max 表示最大存储大小为 2^31-1 字节(2 GB)。存储大小(以字节为单位)是输入的实际数据长度的两倍再加上 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
决定了字符串的长度(字符数)。
nvarchar
的数据长度是varchar
的两倍。
VARCHAR
只存储基于数据所需的字节数。 - Pரதீப்VARCHAR
和CHAR
搞混了。即使你的字符串只有 5 个字符,CHAR(100)
也会始终创建一个大小为 100 的字符串值。而VARCHAR
不会这样做。这就是 VAR 的含义(变量)。 - Jens