SQL Server上的Varchar存储与Varchar存储



我刚刚被一位同事告知,如果您为数据库中的VARCHAR字段分配一个长度,例如VARCHAR(1000),那么数据库将强制数据库为每行保留1000字节的空间,无论是否需要。

然而,他声称NVARCHAR(1000)字段只会保存所需的字节数。

我已经尽我所能地研究了这一点,无论是在这里还是在网上,但我找不到任何支持这一点的东西,也没有SQL Server帮助文档提到这一点,我可以找到。

From MSDN:

varchar [(n | max)]

可变长度,非unicode 字符串数据。n定义字符串长度,取值范围从1到 8000 max表示最大存储空间为2^31-1字节(2gb)。存储大小为输入数据的实际长度+ 2字节。

nvarchar [(n | max)]

变长Unicode字符串数据。n定义字符串长度,取值范围从1到 4000 max表示最大存储空间为2^31-1字节(2gb)。存储大小(以字节为单位)为实际输入数据长度的两倍+ 2字节。

:

每个非空varchar(max)nvarchar(max)列需要24字节的额外固定分配,这与排序操作期间8060字节的行限制相违背。

检查存储数据的大小,可以使用DATALENGTH

返回用于表示任何表达式的字节数。

您可以做这个简单的测试来检查用于存储varcharnvarchar数据的长度和字节:

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(字符数)。

nvarchar的DATALENGTH是varchar的两倍。

Nvarchar存储UNICODE数据。如果你有存储的需求UNICODE或多语言数据,nvarchar是一个选择。Varchar商店ASCII数据,应该是正常使用时选择的数据类型。关于内存使用,nvarchar每个字符使用2字节,而Varchar使用1.

来源- https://dba.stackexchange.com/questions/36081/write-differences-between-varchar-and-nvarchar

CHAR和VARCHAR听起来有点混淆。

CHAR/NCHAR是固定长度的,因此它们将始终保存定义的字节数。例如,如果您创建一个字段类型为CHAR(10)的表,无论您输入的值是否包含更少的字符,每行都将保留10个字节。剩余的长度用空格填充。

VARCHAR/NVARCHAR是可变长度的,所使用的字节量取决于它所包含的列的值。例如,如果你创建一个字段类型为VARCHAR(10)的表,每一行可以是不同的大小,这取决于该列中保存的值的长度。

最新更新