2015-09-04 55 views
2

我建立一个网站,可能有unicode字符在客户端没有指定,我想使用nvarchar作为数据类型在sql服务器上。在varchar上使用nvarchar有什么缺点吗?存储数据时,什么并不总是使用nvarchar over varchar?

为什么任何人都希望在nvarchar上使用varchar,如果nvarchar可以容纳更多字符varchar的话。使用nvarchar的唯一缺点是数据在nvarchar和varchar中会更大?

也可以Nvarchar仍然存储varchar存储的所有字符?

+1

[varchar和nvarchar有什么区别?](http://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar) –

+0

的另一个问答相同的主题http://stackoverflow.com/questions/612430/when-must-we-use-nvarchar-nchar-instead-of-varchar-char-in-sql-server –

+0

'nvarchar'使用两倍的存储空间作为'varchar'(每个字符总是2个字节,而不是1个)。所以,如果你真的不需要* Unicode字符,这只是浪费空间 –

回答

4

我认为你所做的(间接)点是你几乎总是想要使用它。一般来说,最好从一开始就接受unicode数据,否则最终会导致您不想要的遗留头痛。对于预期的投入,你会忽略什么。系统有一个习惯,比你想象的要大,需要处理国际化的投入。有些字段需要限制。例如,如果您要存储域名,那么跨系统支持多语言字符可能仍然不可靠(正在进行),因此您需要限制输入的内容。在这些情况下,您需要将输入限制在较高的级别,例如通过UI级别的正则表达式,否则如果您在数据库中声明了varchar字段,则只会得到完全错误的字符如果一个unicode角色设法通过存储的话。

空间不是问题,这些天,但也有性能方面的考虑,但情况是不太可能会超过对可扩展性的需求:

https://msdn.microsoft.com/en-us/library/ms189617.aspx

一个关键点是,你需要明确指定您在整个应用程序层始终使用UTF-8 始终为以获得全面的国际支持。

+1

正确 - 大部分。但是如果你需要例如将序列号或IP地址存储为仅由数字,点和破折号等组成的字符串,您可以使用'varchar'代替,并保存每行存储的几个字节。空间仍然** IS * *涉及繁忙服务器的主内存时出现问题! –

3

选择数据类型与科学一样具有艺术性。但是当它归结时,你选择的类型意味着一个约束。例如,我不会选择nvarchar(50)来存储美国邮政编码。所以不要盲目选择nvarchar,因为它更宽容 - 这不是一个功能!选择nvarchar是因为您合法地认为该字段需要适应Unicode字符。也就是说它可能不适合你所有的专栏。

至于你的第二个问题,nvarchar是一个严格的varchar超集。

相关问题