SQL Server:何时使用排序规则和 nvarchar

问题描述 投票:0回答:2

目前我的 SQL Server 表中的列数据类型是

varchar

我想在我的列中存储英文和中文字符。

我必须遵循哪些步骤才能使用排序规则,或者我是否必须将数据类型更改为

NVARCHAR
并以
N'
作为 unicode 插入?

如果我必须使用排序规则,我应该使用什么排序规则。

请帮助我

sql-server collation varchar multilingual nvarchar
2个回答
4
投票

您正在混淆两个概念:

  • 数据类型和编码

VARCHAR
以 8 位块的形式存储数据。总共 256 个不同的值不足以解决每个字符的问题。 UTF-8 也是 1 字节存储,为此使用了一种技巧:基本字符是一个块。但有时会有一个特殊的块告诉引擎,该字符必须被解释为两字节字符。如果您接触具有非常不同的字符集的语言,您甚至会发现需要三到四个字节来编码单个字符的字符。

VARCHAR
使用另一个技巧:排序规则添加一个代码页来解释值。在大多数情况下,下半部分或多或少是“纯拉丁语”,而上半部分则为给定语言添加特殊字符。特殊字符的数量非常有限!这意味着,通过不同的排序规则查看
VARCHAR
中的相同值将给出不同的结果。

NVARCHAR
将每个字符存储为 UCS-2(与 UTF-16 - 2 字节存储几乎相同)。这允许对所有字符进行单一编码,不需要任何技巧(嗯,有一些表情符号......)。

  • 整理

排序规则的主要用途是用于排序和字符串比较。当您处理

WHERE
中、
JOIN
内或索引中的字符串值以及进行任何类型的排序时,会使用它。

如上所述,它将添加一个代码页来解释值,这在 1 字节世界中非常重要。

SQL Server 有一个默认排序规则,与新数据库一起使用 - 非常重要! - 在临时表中。

允许在数据库级别定义不同的默认排序规则,但是如果您对排序规则不相同的临时表运行查询,这可能会导致严重的问题。

您也可以在列级别定义排序规则。

您甚至可以在每列的语句中单独定义排序规则。这是最高级别的控制,但意味着大量的打字和非常难以阅读的代码...

对你来说最重要的是:

如果您想将英文和中文存储在一列中,您必须使用

NVARCHAR
。没有“适合一切”的排序规则,你必须尝试一下。并且您必须向任何字符串文字添加前导N (
N'your text'
)。
您可以将字符串存储在具有正确配置的边表中,并将其绑定到您的查询中...

更新:广告

正确配置

您应该对英文和中文字符串使用不同的列。或者甚至为每种语言提供一个单独的边表...这允许您分别为每个列/语言设置最佳排序规则。并且可以轻松地在多语言环境中添加新语言。


0
投票
必须使用

nvarchar


如果您在包含 Unicode 字符的 SQL 脚本中定义

字符串文字

,那么您必须使用N'....'字符串前缀。

    

© www.soinside.com 2019 - 2024. All rights reserved.