5

当我用数据类型描述表时,和有nvarchar什么区别?我看到那总是双重的。例如,值为,精度为 64,长度为 128。PrecisionLengthLengthnvarchar(64)

CREATE TABLE T(X nvarchar(64))
EXEC sp_columns 'T'
4

5 回答 5

6

精度对文本数据没有意义。

至于 Length 属性,我认为您将它与SizeSQL Server Management Studio 报告的混淆了,后者是列的大小(以字节为单位)。一列的 64Length是128。nvarchar(64)Size

unicode 类型(nchar、nvarchar)的大小是字符数的两倍,因为 Unicode 对每个字符使用两个字节。

您可以使用LEN函数获取这些值以获取字符数,并使用DATALENGTH函数获取字节数,例如。

select len(N'some value'), datalength(N'some value')

返回10 20

编辑

从您的评论中,我看到您使用sp_columns来获取表的架构信息。您不应使用任何目录存储过程,而应使用目录视图。

正如文档所述,目录存储过程用于支持 ODBC 应用程序,因此它们的结果是有限的并且可能需要解释,正如您发现的那样。sp_columns例如,不区分字符和数据长度。

类似于INFORMATION_SCHEMAsys模式中的模式视图返回详细且明确的信息。例如,INFORMATION_SCHEMA.COLUMNS返回字符 lnegth inCHARACTER_MAXIMUM_LENGTH和 byte size in CHARACTER_OCTET_LENGTH。它还包括排序规则和未返回的字符集信息sp_columns

视图由 ISO 定义,INFORMATION_SCHEMA因此它们不包含一些特定于 SQL Server 的信息,例如列是计算列、存储在文件流中还是复制列。您可以使用系统对象目录视图(如sys.columns)获取此信息

于 2013-08-20T14:25:16.410 回答
1

NVARCHAR 没有精度。精度用于十进制。而length是字符长度。

nvarchar [ ( n | max ) ]

可变长度的 Unicode 字符串数据。n 定义字符串长度,可以是 1 到 4,000 之间的值。max 表示最大存储大小为 2^31-1 字节(2 GB)。存储大小(以字节为单位)是输入数据实际长度的两倍 + 2 个字节。nvarchar 的 ISO 同义词是国家字符变化和国家字符变化。

来源: -

精度是数字中的位数。

数字数据类型的长度是用于存储数字的字节数。字符串或 Unicode 数据类型的长度是字符数

于 2013-08-20T14:25:55.260 回答
0

NVARCHAR没有precision,而length将是字符长度。试试下面的 SQL

SELECT LEN('Whats the length of this string?')

您可能会将其与Numericor混淆Decimal,请参见此处的图表

于 2013-08-20T14:26:02.527 回答
0

3年后但仍然相关..有类似的问题;

我遇到了一个 UDDT 'd_style',使用 alt+f1 我看到这是一个 'nvarchar, length=2, prec=1'。

事实上,我不能在这个字段中插入例如“EU”,因为数据会被截断。所以长度 2 在这里并不意味着 2 个字符。这是因为每个字符保存为 2 个字节,因此 prec = length/2。

在这种情况下,“精度”确实是允许的最大字符数。

但是,当您使用“nvarchar”数据类型创建新表时,如果您希望能够插入示例值“EU”,则只需输入所需的长度(例如 my_field nvarchar(2))。

请注意,这一切都非常“实用”,理论上,精度仅适用于数值,并且是数字中的位数。所以我们不应该谈论 nvarchar 的“精度”。

于 2016-04-26T14:13:17.320 回答
0

事实上,这在 SQL Server 中是一个令人困惑的话题,甚至文档也是不合算的。

例如参见CREATE TABLE的语法定义

<data type> ::=   
[ type_schema_name . ] type_name   
    [ ( precision [ , scale ] | max |   
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]  

您在这里看不到“长度 | 精度”,而只有精度。正如其他人指出的那样,在文档中的其他任何地方,在谈论字符数据类型时,他们都将相同的属性称为长度。除非他们不这样做,例如sp_help和同伴的文档。

Length  int     Column length in bytes.
Prec    char(5) Column precision.
Scale   char(5) Column scale.

这里的长度是存储长度。(大多数人会称之为尺寸。)

所以很遗憾,您的问题没有正确或最终的答案,您必须始终考虑上下文,并在有疑问时查阅文档。

于 2016-09-14T17:25:45.287 回答