SQL Server列的大小差异

7
我在SQL Server中有一张名为“Temp”的表,它包含Addr1、Addr2、Addr3和Addr4列以及其他一些列。这些列的数据类型为nvarchar。当我通过对象资源管理器检查这些列的大小时,它们都显示为nvarchar(100)。

enter image description here

但是当我使用 Alt + F1 检查它们时,它会在结果窗格中显示细节,长度为200。以下是屏幕截图。

enter image description here

为什么会有不同?当我输入超过 100 个字符时,为什么会出现截断错误?似乎只取了前 100 个字符。请告诉我长度值的具体含义。谢谢,Prakash。

已经在这里回答了:https://dev59.com/cWEi5IYBdhLWcg3wd8EF#21259797。 - Wojciech Tomczyk
1
@WojciechTomczyk是吗?那个答案似乎没有特别涉及对象资源管理器中所见与sp_help结果之间的差异,只是说明NVARCHAR值占用两倍的存储空间。除非我误解了您链接的问题/答案。 - 3N1GM4
@3N1GM4 是的,赞同。我在链接答案方面也太热情了... - Wojciech Tomczyk
1个回答

14
因为Object Explorer中列出的大小是字符数,而查询sp_help结果中列出的大小是字节数
SQL中的VARCHAR值每个字符使用1个字节,而NVARCHAR值每个字符使用2个字节。这两者还需要额外的2个字节开销 - 详见下文。因此,因为您正在查看NVARCHAR列,所以存储100个字符需要200(实际上是202)字节,而VARCHAR只需要100(实际上是102)字节。 参考资料: MSDN:char 和 varchar

存储大小是输入数据的实际长度+2个字节。

MSDN:nchar 和 nvarchar

存储大小(以字节为单位)是输入数据的实际长度的两倍+ 2个字节。

(我加粗了)

MSDN:sp_help

报告有关数据库对象(sys.sysobjects兼容视图中列出的任何对象)、用户定义的数据类型或数据类型的信息。

    /------------------------------------------------------------------------\
    | 列名        | 数据类型 | 描述                                         |
    |-------------+-----------+----------------------------------------------|
    |     长度    | smallint  | 数据类型的物理长度(以字节为单位)。          |
    \------------------------------------------------------------------------/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接