确定Nvarchar长度

时间:2014-01-21 13:35:31

标签: sql sql-server nvarchar

我已经阅读了所有关于varchar与nvarchar的内容。但我没有看到我认为是一个简单问题的答案。如何确定nvarchar柱的长度?对于varchar,它非常简单:例如,我的描述可以包含100个字符,因此我定义了varchar(100)。现在我被告知我们需要国际化和支持任何语言。这是否意味着我需要将Description列更改为nvarchar(200),即只需将长度加倍? (而且我忽略了目前涉及国际化的所有其他问题。)

这么简单吗?

4 个答案:

答案 0 :(得分:14)

通常它与varchar实际上是一样的。该数字仍然是最大字符数而不是数据长度。

nvarchar(100)允许100个字符(在SQL Server中可能占用200个字节)。

你可能想要考虑这样一个事实,即不同的文化可能需要更多的角色来表达同样的事情。

但是,如果您使用的是SC归类(支持supplementary characters),则会出现例外情况。在这种情况下,单个字符最多可能占用4个字节。

最糟糕的情况是将声明的字符值加倍。

答案 1 :(得分:0)

从Microsoft网站上获取:

一个常见的误解是认为NCHAR(n)和NVARCHAR(n),n定义了字符数。但是在NCHAR(n)和NVARCHAR(n)中,n以字节对(0-4,000)定义字符串长度。 n永远不会定义可以存储的字符数。这类似于CHAR(n)和VARCHAR(n)的定义。 产生误解的原因是,当使用在Unicode范围0-65,535中定义的字符时,每个字节对可以存储一个字符。但是,在较高的Unicode范围(65,536-1,114,111)中,一个字符可以使用两个字节对。例如,在定义为NCHAR(10)的列中,数据库引擎可以存储使用一个字节对(Unicode范围0-65,535)的10个字符,但是在使用两个字节对(Unicode范围65,536-Unicode)时,少于10个字符。 1,114,111)。有关Unicode存储和字符范围的更多信息,请参见

https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql?view=sql-server-ver15

答案 2 :(得分:0)

@Musa Calgar-完全正确。该链接包含有关此问题的答案的信息。

但是为了确保问题本身明确,我们正在谈论的是当我们查看给定表的列定义时看到的'length'属性,对吗?那就是每列分配的存储空间。另一方面,如果我们想知道给定时刻表中给定字符串的字符数,则可以: “ 从myTable中选择myColumn,LEN(myColumn)

但是,如果需要存储长度,则可以使用SSMS将表名拖到查询窗口中,突出显示它,然后使用“ Alt-F1 ”查看每列的定义长度。

因此,作为一个示例,我创建了一个这样的表来指定归类。 (Latin1_General_100_CI_AS_SC允许使用补充字符-即占用不超过2个字节的字符):

CREATE TABLE [dbo].[TestTable1](
    [col1] [varchar](10)  COLLATE Latin1_General_100_CI_AS,
    [col2] [nvarchar](10) COLLATE Latin1_General_100_CI_AS_SC,
    [col3] [nvarchar](10) COLLATE Latin1_General_100_CI_AS
) ON [PRIMARY]

长度显示如下(在查询窗口和Alt-F1中突出显示):

Column_Name    Type        Length  [...] Collation

col1           varchar      10           Latin1_General_100_CI_AS
col2           nvarchar     20           Latin1_General_100_CI_AS_SC
col3           nvarchar     20           Latin1_General_100_CI_AS

如果在varchar和nvarchar字段中插入ASCII字符,则可以将10个字符放入所有字符中。如果您尝试在这些字段中输入10个以上的字符,则会出现错误:

字符串或二进制数据将被截断。 该声明已终止。”

如果您插入非ASCII字符(例如'ā'),您仍然可以将其中的10个字符放入其中,但是SQL Server会将输入到col1的值转换为最适合的已知字符1个字节。在这种情况下,“ ā”将转换为“ a ”。

但是,如果您插入需要4个字节来存储的字符(例如','),则只能将其中的5个字符放入varchar和nvarchar字段中。超过此数量将导致上面显示的截断错误。 varchar字段将显示问号,因为它没有可将该输入转换为的单字节字符。

因此,当您插入五个“?”时,请使用len()选择该行,您将看到以下内容:

col1          len(col1)    col2          len(col2)      col3           len(col3)
??????????    10           ?????     5              ?????      10

因此,由于创建表时定义了补充字符,因此col2的长度显示5个字符(请参见上面的CREATE TABLE DDL语句)。但是,col3的排序规则没有_SC,因此它显示了我们插入的五个字符的长度10。 请注意,col1有十个问号。如果我们使用_SC排序规则而不是非补充排序规则来定义col1 varchar,则其行为方式相同。

答案 3 :(得分:-1)

通过执行以下代码,您可以通过一个简单的实验获得答案。

DECLARE @a varchar(4);  SET @a = '123456';  SELECT @a;
DECLARE @b nvarchar(4);  SET @b = '123456';  SELECT @b;