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

JD.*_*JD. 5 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

mar*_*c_s 13

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

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

  • 需要支持阿拉伯语,希伯来语,西里尔语或任何东亚语言 - 只有在Unicode中才能真正捕获这些字符
  • 需要支持使用"标准"拉丁字母的其他语言,但有特殊字符 - 东欧(斯拉夫)语言及其字符之类的东西 ? ? ? - 这些将存储c, a, e在varchar()字段中

NVarchar(max)是一个很好的选择 - 如果你真的需要高达2 GB的文本.使所有字符串字段nvarchar(max)只是"一致"是一个非常糟糕的主意 - 你将遇到大量的性能问题.请参阅Remus Rusanu 关于该主题文章


Cad*_*oux 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(长度)可以大大提高性能.