SQL Server上的NVarchar存储与Varchar存储

时间:2016-10-14 10:17:17

标签: sql-server

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

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

我已经在这里和网络上尽我所能地研究了这个,但我找不到任何支持它的东西,SQL Server帮助文档也没有提到我能找到的任何地方。

3 个答案:

答案 0 :(得分:31)

来自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个字节。

  

每个非null varchar(max) nvarchar(max)列需要24个字节的额外固定分配,在排序操作期间计入8,060字节行限制。

要检查存储数据的大小,您可以使用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的两倍。

答案 1 :(得分:10)

  

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

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

答案 2 :(得分:7)

听起来CHAR和VARCHAR之间存在混淆。

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

VARCHAR / NVARCHAR是可变长度,使用的字节数将根据其包含的列的值而变化。例如如果使用VARCHAR(10)类型的字段创建表,则每行可以是不同的大小,具体取决于该列中保存的值的长度。