长度与精度

时间:2013-08-20 14:22:29

标签: sql-server

当我描述一个包含nvarchar数据类型的表时,PrecisionLength之间有什么区别?我看到Length总是双倍的。例如,值为nvarchar(64),精度为64,长度为128。

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

5 个答案:

答案 0 :(得分:6)

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

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

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

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

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

返回10 20

修改

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

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

INFORMATION_SCHEMAsys模式中的模式视图会返回详细且明确的信息。例如,INFORMATION_SCHEMA.COLUMNS返回CHARACTER_MAXIMUM_LENGTH中的字符lnegth和CHARACTER_OCTET_LENGTH中的字节大小。它还包括sp_columns未返回的归类和字符集信息。

INFORMATION_SCHEMA视图由ISO定义,因此它们不包含一些特定于SQL Server的信息,例如列是计算列,存储在文件流中还是复制。您可以使用system object catalog views

sys.columns来获取此信息

答案 1 :(得分:1)

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

  

nvarchar [(n | max)]

     

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

来自source: -

  

精确度是数字中的位数。

     

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

答案 2 :(得分:0)

NVARCHAR没有precisionlength将是字符长度。尝试以下SQL

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

您可能会使用NumericDecimal来解决此问题,请参阅chart here

答案 3 :(得分:0)

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

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

事实上,我无法插入,例如'欧盟'在此字段中,因为数据将被截断。 所以长度2并不意味着2个字符。这是因为每个字符保存为2个字节,因此prec = length / 2。

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

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

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

答案 4 :(得分:0)

实际上,这在SQL服务器中是一个令人困惑的主题,即使文档是不存在的。

例如,请参阅CREATE TABLE

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

你没有看到&#34;长度|精度&#34;这里,但只有精度。 正如其他人所指出的那样,在讨论字符数据类型时,文档中的其他地方都会引用与长度相同的属性。除非他们没有,例如sp_help和同伴的文档。

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

此处长度为存储长度。 (大多数人会称之为大小。)

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