我们必须使用Unicode类型时是否有规则?
我已经看到大多数欧洲语言(德语,意大利语,英语......)在VARCHAR列中的同一数据库中都很好.
我正在寻找类似的东西:
如果你有中文 - >使用NVARCHAR
如果你有德语和阿拉伯语 - >使用NVARCHAR
那么服务器/数据库的整理呢?
我不想像这里建议的一样使用NVARCHAR.varchar 和nvarchar SQL Server数据类型之间的主要性能差异是什么?
您想要使用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否则
您必须在任何时候存储多种语言时使用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字符,避免额外的转换并占用空间.因此我先前的发言.