我为什么不';在Sql Server中不使用NVARCHAR?

我为什么不';在Sql Server中不使用NVARCHAR?,sql,sql-server,varchar,nvarchar,Sql,Sql Server,Varchar,Nvarchar,我现在正在设计一个数据库方案,我想为了安全起见,我应该对文本列的数据类型使用nvarchar(用于unicode支持)。虽然我不期望非英语文本,但我认为最好从一开始就支持它,以防万一 有什么理由让我坚持使用纯varchar吗?性能?是的,性能,尺寸。nvarchar占用更多字节,我认为它是双字节的(如果我错了,请纠正我),这是因为unicode支持。因此,如果您不需要unicode支持,可以使用常规的varchar。在当今的i18n世界中,nvarchar非常有意义。varchar对于指定为非u

我现在正在设计一个数据库方案,我想为了安全起见,我应该对文本列的数据类型使用nvarchar(用于unicode支持)。虽然我不期望非英语文本,但我认为最好从一开始就支持它,以防万一


有什么理由让我坚持使用纯varchar吗?性能?

是的,性能,尺寸。nvarchar占用更多字节,我认为它是双字节的(如果我错了,请纠正我),这是因为unicode支持。因此,如果您不需要unicode支持,可以使用常规的varchar。

在当今的i18n世界中,nvarchar非常有意义。varchar对于指定为非unicode的数据可能有意义(可能您有一些系统字段要求为ASCII)

默认情况下,我会使用nvarchar来表示名称、描述、地址等

varchar
更小,因此与
nvarchar
相比,
varchar
可能会节省一些IO(但请注意,代码页也会成为一个更大的问题)。

此外,请参见此问题:


就我个人而言,我说坚持varchar(正如我在本文中回答的那样)。有一个非常重要的性能开销。

我们几乎在所有方面都使用VARCHAR,而NVARCHAR只是偶尔使用

产品代码不需要NVarchar-我们不允许除A-Z、0-9和“u”之外的任何内容

它的存储空间是原来的两倍,但每个索引页(和每个数据页)只有一半的条目,一半的内存缓存被“浪费”,比较数据的CPU周期更多,等等

IME常用的外国口音只能在Varchar(即拉丁语-1)中找到。我们没有计划使用中文或其他替代字符集,当我们这样做时,从第一天开始使用NVarchar来处理该字符集将是我们最不担心的事情-文本从右向左或垂直对齐??:(

如果你允许NVarchar,比如说,一个名字,你将如何从键盘输入扩展字符?如果你导入数据(因此它已经是NVarchar)你将如何使用标准的QWERTY键盘搜索该客户。很多应用程序都涉及到国际化,所以我的观点是“允许使用NVarchar”是没有意义的


但是我又去了很多地方,有NVarchar…而且大多数专栏也有50个字符宽…他们一定知道一些我不知道的关于人口增长和邮政编码扩展计划的信息!!

如前所述,权衡是未来验证还是性能。以我的经验,SQL Server在低成本方面做得相当好呃CPU和内存的限制,但是给它一个缓慢的磁盘I/O,它真的会嘎嘎作响


如果您没有双字节字符集(即中文字符)的计划,请坚持使用VARCHAR(MAX).

一般来说,从最昂贵且约束最少的数据类型开始。将其投入生产。如果性能开始出现问题,请找出这些nvarchar列中实际存储的内容。其中是否有任何字符不适合varchar?如果没有,请切换到varchar。不要尝试预先优化或者你知道痛苦在哪里。我猜在nvarchar/varchar之间的选择并不会在可预见的未来降低你的应用程序的速度。在应用程序的其他部分,性能调整会给你带来更多的回报。

我会在你的问题中添加SQL Server版本,这可能会有所不同rence?我目前使用的是sql server 2005,但我们希望最终进入2008年。虽然我不确定他们在sql server中使用的是哪种unicode编码,但它可能是可变的。也就是说,unicode中的一个字符在某些编码中可以是1-4字节。