是否应该使用NVARCHAR将“重音符号”保存到Sql Server中?

时间:2019-09-05 06:53:29

标签: sql-server unicode

我在Sql Server表中具有以下两个字段:

当我在字段中添加一些带有重音符号的测试数据时,它实际上存储了它们!我以为我必须将列从VARCHAR更改为NVARCHAR才能接受带重音符号的字符,等等?

基本上,我认为:

  • VARCHAR = ASCII
  • NVARCHAR = Unicode

这是façadeare actually ASCII ..而某些其他字符会出错(如果VARCHAR)的情况吗?

我可以在扩展 ASCII图表(上面的链接)中看到çé字符..这是否意味着ASCII包括0-> 127或0- > 255?

(想法:我想我很高兴接受0-> 255并删除其他任何内容。)

编辑

  • 数据库整理:Latin1_General_CI_AS
  • 服务器版本:12.0.5223.6
  • 服务器归类:SQL_Latin1_General_CP1_CI_AS

2 个答案:

答案 0 :(得分:9)

首先,详细介绍Sql Server正在做什么。

VARCHAR使用特定的 collation 存储个字节字符。 ASCII仅使用7位或一个字节中可能值的一半。排序规则引用特定的代码页(以及排序和等同规则)以使用每个字节中另一半的可能值。这些代码页通常包括对 limited 和特定的重音字符集的支持。如果用于数据的代码页支持重音符,则可以执行;如果不是,您会看到奇怪的结果(不可打印的“框”或?字符)。您甚至可以输出存储在一个排序规则中的数据,就好像它已经存储在另一排序规则中一样,并以这种方式获得真正奇怪的东西(但不要这样做)。

NVARCHAR是unicode,但仍然有些依赖归类。在大多数情况下,您将以UTF-16结尾,这确实允许使用所有范围的unicode字符。相反,某些排序规则将导致UCS-2出现,这会稍微受到限制。有关更多信息,请参见nchar/nvarchar documentation

作为另一个怪异,使用正确的排序规则时,charvarchar中即将出现的Sql Server 2019 will include support for UTF-8类型。

现在回答问题。

在极少数情况下,您确定,您的数据仅需要支持源自单一特定(通常是本地)文化的重音字符,而仅 这些特定重音字符,则可以使用varchar类型。

但是请非常小心进行此确定。在一个日益全球化和多样化的世界中,即使是小型企业也希望利用Internet来扩大其覆盖范围,甚至在他们自己的社区内,使用不足的编码也很容易导致错误甚至安全漏洞。在大多数情况下,看起来像varchar的 编码已经足够好了,现在真的不再安全了。

就我个人而言,今天varchar唯一使用的地方是助记符代码字符串,这些字符串永远不会显示给最终用户或由最终用户提供。程序代码中可能是enum值的内容。即使这样,它也往往是遗留代码,并且在给定选项的情况下,我将改用整数值,以实现更快的联接和更有效的内存使用。但是,即将推出的UTF-8支持可能会改变这一点。

答案 1 :(得分:0)

使用当前系统代码页,VARCHAR是ASCII-因此,您可以保存的字符集取决于哪个代码页。

NVARCHAR是UNICODE,因此您可以存储所有字符。