在SQL Server中更改列varchar(255)nvarchar

时间:2010-04-22 16:49:26

标签: sql-server

我正在使用SQL server 2008 express,我们的一些列被定义为varchar(255)。我应该将这些列转换为NvarChar(255)还是nvarchar(max)?

我问的原因是我读到unodeode字符的nvarchar(255)实际上会存储1/2个字符数(因为unicode字符是2个字节)而255个varchar()允许我存储255个字符(或者是偏移的255 - 2。

使用nvarchar(max)会有任何性能命中吗?

JDS

2 个答案:

答案 0 :(得分:13)

嗯,不完全 - 转换为NVarChar(255)不会减少存储的字符数 - 它仍然存储255个字符。它只需要两倍的空间(510字节对255字节)。

你应该转换为NVARCHAR - 即使它一直使用两倍的空间 - 如果你:

  • 需要支持阿拉伯语,希伯来语,西里尔语或任何东亚语言 - 只有在Unicode中才能实际捕获这些字符
  • 需要支持使用“标准”拉丁字母的其他语言,但需要使用特殊字符 - 东欧(斯拉夫)语言及其č ă ě等字符 - 这些语言将仅存储为{{1} }在varchar()字段中

NVarchar(max)是一个很好的选择 - 如果你真的需要最多2 GB的文本。使所有字符串字段nvarchar(max)只是“一致”是一个非常糟糕的主意 - 你将遇到大量的性能问题。见Remus Rusanu的article on the topic

答案 1 :(得分:5)

对于您使用的每种数据类型,您都应该有某种理由。

nvarchar(255)(在SQL Server中)存储255个Unicode字符(510字节加上开销)。

当然可以在varchar列中存储普通的UTF-8编码的Unicode数据 - 源中每个字节一个varchar字符(UTF-8将为宽字符适当地使用多个字节)。在这种情况下,普通的ASCII数据每个字符只使用1个字节,因此您没有双字节开销。它有很多缺点,其中最重要的是数据库不再能够对排序和其他字符处理工作提供帮助,因为数据可能被编码。但是,就像我说的那样,这是可能的。

我建议使用适当长度的char或varchar字符,例如帐号,因为零填充很重要,许可证编号,发票号码(带字母),邮政编码,电话号码等,因此可能不会使用小数。这些是不包含任何宽字符的列类型,通常仅限于罗马字母和数字,有时甚至不是标点符号,并且通常会被严格索引。对于表和索引中的列以及数据库引擎中的工作集中的所有这些字符,绝对不需要额外NUL高字节的开销。

我推荐nvarchar用于名称和地址等等,可以使用宽字符,甚至可能在短期内没有可预见的用途。

我通常从不使用nchar - 我从来不需要需要宽字符的短代码(通常是我选择char列的地方)。

在所有情况下,应该充分考虑长度(或最大)使用情况。我肯定不会使用max作为名称或地址,并且在基准测试中开销很明显。我已经看到在查询的中间阶段转换为varchar(长度)可以大大提高性能。