为什么在存储数据时不总是使用 nvarchar 而不是 varchar?

Why not always use nvarchar over varchar when storing data?

我正在构建一个网站,其中可能包含客户端未指定的 unicode 字符,我想在 sql 服务器上使用 nvarchar 作为数据类型。在 varchar 上使用 nvarchar 有什么缺点吗?

如果 nvarchar 可以容纳比 varchar 更多的字符,为什么会有人想要使用 varchar 而不是 nvarchar。使用 nvarchar 的唯一缺点是数据在 nvarchar 中比在 varchar 中更大吗?

还有nvarchar还能存储varchar存储的所有字符吗?

我认为您要表达的(间接)观点是您几乎总是想使用它。一般来说,最好从一开始就接受 unicode 数据,否则你最终会遇到你不想要的遗留问题。您会惊讶于在预期输入方面您可以忽略什么。系统习惯于变得比你预期的更大,需要处理国际化的输入。您需要限制某些字段。例如,如果您正在存储域名,那么跨系统对多语言字符的支持可能仍然不可靠(正在处理),因此您需要限制此类内容的输入。在这些情况下,您需要在更高级别限制输入,例如通过 UI 级别的正则表达式,否则如果您在数据库中声明了一个 varchar 字段,您最终会得到如果 unicode 字符确实能够通过,则存储的字符完全错误。

Space 现在不是问题,但是有性能方面的考虑,尽管场景不太可能超过可伸缩性的需要:

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

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

选择数据类型既是一门艺术,也是一门科学。但归根结底,您选择的类型意味着约束。例如,我不会选择 nvarchar(50) 来存储美国邮政编码。所以不要盲目地选择 nvarchar,因为它更宽松——这不是一个特性!选择 nvarchar 是因为您有理由相信该字段需要容纳 Unicode 字符。也就是说,它可能不适用于您的所有专栏。

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

我总是在我的 sql 存储过程/函数等和我的 vb.net 类 中使用 varchar 并在必要时转换为 nvarchar。那就是说我目前所有的工作都是“国家”而不是国际。但是 space 是一个大问题,当您部署到基于云的架构(如 Azure)并且您正在处理数十亿行和数千列时。它变得昂贵。任何限制您需要消耗的 space 数量的方法都是我的奖励。