我刚刚收到一位同事的通知,如果你为数据库中的VARCHAR字段分配一个长度,例如VARCHAR(1000),那么数据库将强制数据库为每一行保留1000个字节的空间,无论它是否是需要.
然而,他声称NVARCHAR(1000)字段将只保留所需的字节数.
我已经在这里和网络上尽可能地研究了这个,但是我找不到任何支持它的东西,SQL Server帮助文档也没有提到我能找到的任何地方.
gof*_*fr1 32
来自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
返回用于表示任何表达式的字节数.
您可以执行此简单测试来检查用于存储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
Run Code Online (Sandbox Code Playgroud)
将输出:
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
Run Code Online (Sandbox Code Playgroud)
基本上n在上面的语句中确定字符串的LENGTH(字符数).
DATALENGTH nvarchar比两倍多varchar.
Ale*_*ec. 10
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)类型字段的表,则每行可以是不同的大小,具体取决于该列中保存的值的长度.
| 归档时间: |
|
| 查看次数: |
43003 次 |
| 最近记录: |