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