我在Sql Server表中具有以下两个字段:
当我在字段中添加一些带有重音符号的测试数据时,它实际上存储了它们!我以为我必须将列从VARCHAR
更改为NVARCHAR
才能接受带重音符号的字符,等等?
基本上,我认为:
VARCHAR
= ASCII NVARCHAR
= Unicode 这是façade
等are 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
答案 0 :(得分:9)
首先,详细介绍Sql Server正在做什么。
VARCHAR
使用特定的 collation 存储个字节字符。 ASCII仅使用7位或一个字节中可能值的一半。排序规则引用特定的代码页(以及排序和等同规则)以使用每个字节中另一半的可能值。这些代码页通常包括对 limited 和特定的重音字符集的支持。如果用于数据的代码页支持重音符,则可以执行;如果不是,您会看到奇怪的结果(不可打印的“框”或?字符)。您甚至可以输出存储在一个排序规则中的数据,就好像它已经存储在另一排序规则中一样,并以这种方式获得真正奇怪的东西(但不要这样做)。
NVARCHAR
是unicode,但仍然有些依赖归类。在大多数情况下,您将以UTF-16结尾,这确实允许使用所有范围的unicode字符。相反,某些排序规则将导致UCS-2出现,这会稍微受到限制。有关更多信息,请参见nchar/nvarchar documentation。
作为另一个怪异,使用正确的排序规则时,char
和varchar
中即将出现的Sql Server 2019 will include support for UTF-8类型。
现在回答问题。
在极少数情况下,您确定,您的数据仅需要支持源自单一特定(通常是本地)文化的重音字符,而仅 这些特定重音字符,则可以使用varchar
类型。
但是请非常小心进行此确定。在一个日益全球化和多样化的世界中,即使是小型企业也希望利用Internet来扩大其覆盖范围,甚至在他们自己的社区内,使用不足的编码也很容易导致错误甚至安全漏洞。在大多数情况下,看起来像varchar
的 编码已经足够好了,现在真的不再安全了。
就我个人而言,今天varchar
唯一使用的地方是助记符代码字符串,这些字符串永远不会显示给最终用户或由最终用户提供。程序代码中可能是enum
值的内容。即使这样,它也往往是遗留代码,并且在给定选项的情况下,我将改用整数值,以实现更快的联接和更有效的内存使用。但是,即将推出的UTF-8支持可能会改变这一点。
答案 1 :(得分:0)
使用当前系统代码页,VARCHAR是ASCII-因此,您可以保存的字符集取决于哪个代码页。
NVARCHAR是UNICODE,因此您可以存储所有字符。