当我描述一个包含nvarchar
数据类型的表时,Precision
和Length
之间有什么区别?我看到Length
总是双倍的。例如,值为nvarchar(64)
,精度为64,长度为128。
CREATE TABLE T(X nvarchar(64))
EXEC sp_columns 'T'
答案 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_SCHEMA或sys模式中的模式视图会返回详细且明确的信息。例如,INFORMATION_SCHEMA.COLUMNS返回CHARACTER_MAXIMUM_LENGTH
中的字符lnegth和CHARACTER_OCTET_LENGTH
中的字节大小。它还包括sp_columns
未返回的归类和字符集信息。
INFORMATION_SCHEMA
视图由ISO定义,因此它们不包含一些特定于SQL Server的信息,例如列是计算列,存储在文件流中还是复制。您可以使用system object catalog views
答案 1 :(得分:1)
NVARCHAR没有精确度。精度用于十进制。长度是字符长度。
nvarchar [(n | max)]
可变长度的Unicode字符串数据。 n定义字符串长度,可以是1到4,000之间的值。最大 表示最大存储大小为2 ^ 31-1个字节(2 GB)。该 存储大小(以字节为单位)是输入数据的实际长度的两倍 + 2个字节。 nvarchar的ISO同义词是国家字符变化和国家字符变化。
来自source: -
精确度是数字中的位数。
数字数据类型的长度是用于的字节数 存储号码。字符串或Unicode数据类型的长度 是字符数
答案 2 :(得分:0)
NVARCHAR
没有precision
,length
将是字符长度。尝试以下SQL
SELECT LEN('Whats the length of this string?')
您可能会使用Numeric
或Decimal
来解决此问题,请参阅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.
此处长度为存储长度。 (大多数人会称之为大小。)
所以遗憾的是,对于您的问题,没有正确或最终的答案,您必须始终考虑上下文,并在有疑问时查阅文档。