【问题标题】:Why not always use nvarchar over varchar when storing data? [closed]为什么在存储数据时不总是使用 nvarchar 而不是 varchar?
【发布时间】:2015-11-30 02:32:31
【问题描述】:

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

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

Nvarchar 还可以存储所有 varchar 存储的字符吗?

【问题讨论】:

标签: sql-server encoding varchar nvarchar


【解决方案1】:

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

现在空间已经不是问题,但是有性能方面的考虑,尽管不太可能超过对可扩展性的需求:

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

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

【讨论】:

  • 正确 - 大多数情况下。但是,如果您需要,例如将序列号或 IP 地址存储为仅由数字和点和破折号等组成的字符串,您可以改用 varchar 并为存储的每一行保留几个字节 .... 空间仍然 IS 涉及繁忙的服务器主内存的问题!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2014-01-24
    • 2014-03-20
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多