.net 如果数据库中的所有列都是VarChar,那么使用SqlDbType.VarChar代替SqlDbType.NVarChar有什么好处吗

.net 如果数据库中的所有列都是VarChar,那么使用SqlDbType.VarChar代替SqlDbType.NVarChar有什么好处吗,.net,sql,sql-server,.net,Sql,Sql Server,数据库中包含文本的所有列过去都是nvarchar,但出于性能原因,我们将它们转换为varchar。现在,我的所有SqlParameters仍然使用SqlDbType.NVarChar,我想将它们更改为SqlDbType.VarChar,但如果我看不到更改它们的任何好处,我不想浪费时间。是值得改变还是浪费时间 我对varchar和nvarchar之间哪一个更好不感兴趣。我想知道如果数据库中的所有字段都是VarChar,那么将SqlParameter.SqlDbType从SqlDbType.NVar

数据库中包含文本的所有列过去都是nvarchar,但出于性能原因,我们将它们转换为varchar。现在,我的所有SqlParameters仍然使用SqlDbType.NVarChar,我想将它们更改为SqlDbType.VarChar,但如果我看不到更改它们的任何好处,我不想浪费时间。是值得改变还是浪费时间


我对varchar和nvarchar之间哪一个更好不感兴趣。我想知道如果数据库中的所有字段都是VarChar,那么将SqlParameter.SqlDbType从SqlDbType.NVarChar更改为SqlDbType.VarChar是否会有任何区别。

更改代码的好处是它应该与数据库匹配。如果您的列现在是varchar,则应该作为varchar访问它们


不这样做可能意味着您最终会在数据库中得到错误编码的文本,或者将单字节字符读取为双字节字符。您可能会损坏所有文本。

如果您使用的是NVARCHAR参数,我希望使用当前数据库的默认排序规则序列将它们转换为varchar:有关详细信息,请参阅

因此,除非您在数据库中使用多个排序规则,否则我不会期望出现问题。如果使用NVARCHAR,您可能会通过线路发送更多数据,但是为了对性能产生显著影响,需要非常大的数据量


另一方面,我看到了Sybase 12的问题-如果在WHERE子句中使用NVARCHAR参数作为条件,与索引的VARCHAR列进行比较,Sybase 12将执行表扫描,而不是自动将参数强制转换为VARCHAR并使用索引。这在过去给我们带来了一些奇怪的性能问题,直到我们了解了发生了什么。这里的解决方案是显式地将参数作为varchar发送。

我同意Oded关于为下一个家伙保持代码一致性的说法。虽然从技术上讲,这可能没有任何好处,但人们应该时刻记住下一个家伙。我有幸协调了75个数据库,虽然它们的版本号完全相同,但在结构上却完全不同。有些强制了外键约束,有些则没有。有些定义了主键,有些没有。不过,同一个代码库正在与所有人进行对话。想想看,他们之所以这样是因为几年前有人走了一条省时的捷径。然后是其他人。然后是其他人。等等,等等,现在这是一个大混乱,这是一个噩梦试图解决它


可维护性和可读性应该在这里取代。毕竟总有一天会有人过来对自己说,“我搞糊涂了。这是怎么回事?嗯……代码上都写着NVarChar,数据库是VarChar……我知道全球化需要NVarChar,也许有一天我们会想全球化这件事……”下一件事你知道,你已经失去了你的性能提升,因为这家伙把所有的数据库字段都改回了NVarChars

以上都是高端用户的绝佳答案。这是一个小小的魔鬼代言人。
我不是说我是对的,我是说这里值得思考。如果您的数据库非常通用/足够小,并且/或者您希望能够轻松切换数据库,那么nvarchar可能是更好的选择。我们经常谈论分层。我们将数据库与代码结合得越紧密,就越难实现即插即用。虽然使用正确的数据类型可以提高性能,但如果最初存储varchar(50)的字段由于新的国际用途而为nvarchar(100)重新创建/更新,该怎么办?是的,我们可以重写我们的代码,是的,我们可能决定创建一个新项目。。。但是,如果我们构建了足够通用的代码来访问新的数据库需求呢?这就是即插即用和良好的代码。因此,在我看来,一些旧的最受欢迎的数据类型已经过时了。但是,对于大多数较旧的数据库,我仍然同意其他人的看法,答案总是:这取决于。

就我所见,使用SqlDbType.NVarChar不会损坏字符。我已经像这样使用了好几个月了,没有任何问题。可能是因为你是始终如一的。如果另一个应用程序出现并使用了
SqlDbType.VarChar
,您将遇到问题。你应该保持代码的一致性,如果不是为了你,那么是为了下一个家伙。我认为你比Oded更好地解释了一致性的原因,如果他们看到NVarChars,你对未来可能出现的问题有很好的看法。谢谢