C#:标准的.Net字符串应该存储在varchar还是nvarchar中?

C#:标准的.Net字符串应该存储在varchar还是nvarchar中?,c#,sql-server,unicode,types,C#,Sql Server,Unicode,Types,我们有一个用C#编写的应用程序,使用.NETFramework 3.0或3.5或类似的东西。作为存储,我们使用SQL Server,并使用Linq 2 SQL与之对话 目前,数据库中的大多数(如果不是全部)文本列都设置为varchar类型(当然长度不同) 但我开始想。。。根据MSDN,“字符串类型表示零个或多个Unicode字符的序列。”这是否意味着我们真的应该将这些列更改为nvarchar以正确存储内容?或者这是怎么回事?他们将它们设置为varchar的理由最初是因为nvarchar需要两倍的

我们有一个用C#编写的应用程序,使用.NETFramework 3.0或3.5或类似的东西。作为存储,我们使用SQL Server,并使用Linq 2 SQL与之对话

目前,数据库中的大多数(如果不是全部)文本列都设置为varchar类型(当然长度不同)

但我开始想。。。根据MSDN,“字符串类型表示零个或多个Unicode字符的序列。”这是否意味着我们真的应该将这些列更改为nvarchar以正确存储内容?或者这是怎么回事?他们将它们设置为varchar的理由最初是因为nvarchar需要两倍的空间(如果我理解正确的话)。据我所知,它可以与varchar一起使用,但我们还没有对不常用的外来字符进行太多测试


有人能解释一下吗?

是的,
nvarchar
将字符存储为unicode,就像.NET字符串一样。如果您需要存储包含不同语言字符的字符串,您可能应该使用
nvarchar


如果您只有一种语言中的字符,您可以选择另一种方法使用
varchar
,并为该语言选择特定的排序规则(这将节省空间,但会使生活更加复杂)。

是的,您确实应该使用NVARCHAR,否则您可能会因为编码问题而丢失字符

据我所知,你这篇文章的主要部分是


使用charmap中字符中心下方的一些字符(如阿拉伯字符)尝试一些示例,看看它们是如何存储的。

除非您有保证在数据库的代码页中可以表示的文本(或者您明确指定了排序规则),否则我会使用nvarchar


在某些情况下,您可以保证内容将是ASCII,在这种情况下,您确实可以使用varchar,但我不知道与绝对确保内容不仅是ASCII,而且您永远不会想要ASCII以外的任何内容相比,这样做的好处有多大(或在特定的代码页内)。

正如其他人所说,您的应用程序是否会存储2字节的Unicode(UTF-16/32)?如果不是,则varchar可以用于普通ascii(甚至可能是窗口默认的UTF8,不确定)…但网络字符串作为UTF16插入

除非您在数据库中保存大量文本,并且磁盘空间不足,否则差异将非常小,因此您最好还是使用NVarchar。

T-SQL中的NVarchar(X)翻译为“UTF-16编码”:每个X字符都有16位宽。如果您存储的是人类可读的文本,则最好使用NVARCHAR进行文本存储。VARCHAR(X)意味着字符的存储为8位。这意味着在C#应用程序之间必须进行一些代码转换(在其
字符串
类型中内部使用UTF-16)还有你的数据库


为自己省去一些麻烦,在存储人类可读字符串的地方要一致地使用Unicode。

从.net方面来看,有很多观点。以下是从数据库方面考虑的:

varchar的大小是nvarchar的一半。虽然这在许多方面并不重要,但对于索引来说却非常重要。一个一半宽的索引速度是nvarchar的两倍。这是因为一个数据页(数据库IO的单位)上可以存储两倍多的值


您(从应用程序)控制某些字符串的构造,并希望使用这些字符串访问重要记录。字母数字标识符(如客户编号)属于此类。由于您控制构造,因此您可以强制这些字符串安全地变为varchar(并且经常这样做)。为什么不为您已经在做的这项工作获得一半大小的双快速索引的好处?

如果您使用的是SQL2005,那么一定要使用nvarchar。如果您使用的是SQL2000,那么请注意8000字节的总行大小限制-使用nvarchar,您会很快遇到这种情况,因为它们占用了两倍的空间。

这是通过什么方式实现的“让生活变得更加复杂"?以空间为例,从长远来看是不值得的。空间很便宜。j0rd4n,首先你必须确保没有其他类型的文本进入。第二,某些版本的SQL server不支持某些排序规则。第三,你应该设置特定的排序规则,并且……大多数情况下,我很乐意接受轻微的性能和存储cnvarchar的ost。我同意只使用nvarchar。它更安全,如果你以后需要它,它会帮你省去头痛。同意。现在磁盘空间很便宜。