当前位置:  开发笔记 > 数据库 > 正文

什么时候必须在SQL Server中使用NVARCHAR/NCHAR而不是VARCHAR/CHAR?

如何解决《什么时候必须在SQLServer中使用NVARCHAR/NCHAR而不是VARCHAR/CHAR?》经验,为你挑选了2个好方法。

我们必须使用Unicode类型时是否有规则?

我已经看到大多数欧洲语言(德语,意大利语,英语......)在VARCHAR列中的同一数据库中都很好.

我正在寻找类似的东西:

    如果你有中文 - >使用NVARCHAR

    如果你有德语和阿拉伯语 - >使用NVARCHAR

那么服务器/数据库的整理呢?

我不想像这里建议的一样使用NVARCHAR.varchar 和nvarchar SQL Server数据类型之间的主要性能差异是什么?



1> Cade Roux..:

您想要使用NVARCHAR的真正原因是当您在同一列中使用不同的语言时,您需要在不解码的情况下在T-SQL中寻址列,您希望能够在SSMS中"本地"查看数据,或者您想要标准化Unicode.

如果将数据库视为哑存储,则完全可以在VARCHAR中存储宽字符串和不同(甚至可变长度)的编码(例如UTF-8).当您尝试编码和解码时会出现问题,特别是如果不同行的代码页不同.这也意味着SQL Server将无法轻松处理数据,以便在(可能是可变的)编码列上查询T-SQL.

使用NVARCHAR可以避免这一切.

我建议NVARCHAR用于任何具有用户输入数据的列,该列相对不受约束.

我建议将VARCHAR用于任何自然键列(如车牌,SSN,序列号,服务标签,订单号,机场呼号等),这些列通常由标准或法规或惯例定义和约束.用户输入的VARCHAR,非常有限(如电话号码)或代码(ACTIVE/CLOSED,Y/N,M/F,M/S/D/W等).绝对没有理由使用NVARCHAR.

所以对于一个简单的规则:

VARCHAR保证受限制NVARCHAR否则


应该注意的是,*"不同的语言"*并不仅仅意味着不同的行可以包含来自不同语言的值.它还意味着数据库的默认排序规则(即服务器计算机的语言环境)与任何客户端计算机的语言环境不同.例如,服务器机器设置为"en-US",但我的PC设置为"fr-US".
许多亚洲国家(包括中国)在其牌照中使用了标识符,因此,除非您100%确定您的程序绝对不会并且永远不会处理此类数据,否则最好将nvarchar用于车牌.是的,这包括交通违规者登记,停车场和车辆运输方法等.来自中国的人完全有可能乘坐渡轮甚至开车到你的国家,并将车停在你的车库里.
>>当你在同一列中有不同的语言时....就是这样!

2> JoshBerke..:

您必须在任何时候存储多种语言时使用NVARCHAR.我相信你必须将它用于亚洲语言,但不要引用我.

如果您以俄语为例并将其存储在varchar中,这就是问题,只要您定义了正确的代码页,就可以了.但是,假设你使用默认的英文sql install,那么俄语字符将无法正确处理.如果您使用的是NVARCHAR(),则可以正确处理它们.

编辑

好的,让我引用MSDN,也许我是特定的,但你不想在varcar列中存储多个代码页,而你可以不应该

处理存储在char,varchar,varchar(max)或文本数据类型中的文本数据时,要考虑的最重要的限制是系统只能验证来自单个代码页的信息.(您可以存储来自多个代码页的数据,但不建议这样做.)用于验证和存储数据的确切代码页取决于列的排序规则.如果尚未定义列级排序规则,则使用数据库的排序规则.要确定用于给定列的代码页,可以使用COLLATIONPROPERTY函数,如以下代码示例所示:

这里还有一些:

此示例说明了许多语言环境(例如Georgian和Hindi)没有代码页,因为它们是仅限Unicode的排序规则.这些排序规则不适用于使用char,varchar或text数据类型的列

所以格鲁吉亚语或印地语真的需要存储为nvarchar.阿拉伯语也是一个问题:

您可能遇到的另一个问题是,当您希望支持的所有字符都不包含在代码页中时,无法存储数据.在许多情况下,Windows将特定代码页视为"最适合"的代码页,这意味着无法保证您可以依赖代码页来处理所有文本; 它只是最好的一个.这方面的一个例子是阿拉伯语脚本:它支持各种语言,包括Baluchi,Berber,Farsi,Kashmiri,Kazakh,Kirghiz,Pashto,Sindhi,Uighur,Urdu等.所有这些语言都有除Windows代码页1256中定义的阿拉伯语之外的其他字符.如果您尝试将这些额外字符存储在具有阿拉伯语排序规则的非Unicode列中,

使用Unicode时要记住一些事项,尽管您可以在单个列中存储不同的语言,但只能使用单个排序规则进行排序.有些语言使用拉丁字符,但不像其他拉丁语言那样排序.口音是一个很好的例子,我不能记住这个例子,但是有一种东欧语言,其Y不像英语Y那样.然后有西班牙语用户在西班牙语用户出口后排序.

总而言之,在处理内部化时,您必须处理所有问题.我认为从一开始就更容易使用Unicode字符,避免额外的转换并占用空间.因此我先前的发言.


>>任何时候你必须使用NVARCHAR存储多种语言这是不正确的.德语,意大利语和英语与VARCHAR列相同.请更具体一点
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有