目前我的 SQL Server 表中的列数据类型是
varchar
。
我想在我的列中存储英文和中文字符。
我必须遵循哪些步骤才能使用排序规则,或者我是否必须将数据类型更改为
NVARCHAR
并以 N'
作为 unicode 插入?
如果我必须使用排序规则,我应该使用什么排序规则。
请帮助我
您正在混淆两个概念:
VARCHAR
以 8 位块的形式存储数据。总共 256 个不同的值不足以解决每个字符的问题。 UTF-8 也是 1 字节存储,为此使用了一种技巧:基本字符是一个块。但有时会有一个特殊的块告诉引擎,该字符必须被解释为两字节字符。如果您接触具有非常不同的字符集的语言,您甚至会发现需要三到四个字节来编码单个字符的字符。
VARCHAR
使用另一个技巧:排序规则添加一个代码页来解释值。在大多数情况下,下半部分或多或少是“纯拉丁语”,而上半部分则为给定语言添加特殊字符。特殊字符的数量非常有限!这意味着,通过不同的排序规则查看 VARCHAR
中的相同值将给出不同的结果。
NVARCHAR
将每个字符存储为 UCS-2(与 UTF-16 - 2 字节存储几乎相同)。这允许对所有字符进行单一编码,不需要任何技巧(嗯,有一些表情符号......)。
排序规则的主要用途是用于排序和字符串比较。当您处理
WHERE
中、JOIN
内或索引中的字符串值以及进行任何类型的排序时,会使用它。
如上所述,它将添加一个代码页来解释值,这在 1 字节世界中非常重要。
SQL Server 有一个默认排序规则,与新数据库一起使用 - 非常重要! - 在临时表中。
允许在数据库级别定义不同的默认排序规则,但是如果您对排序规则不相同的临时表运行查询,这可能会导致严重的问题。
您也可以在列级别定义排序规则。
您甚至可以在每列的语句中单独定义排序规则。这是最高级别的控制,但意味着大量的打字和非常难以阅读的代码...
对你来说最重要的是:
如果您想将英文和中文存储在一列中,您必须使用
NVARCHAR
。没有“适合一切”的排序规则,你必须尝试一下。并且您必须向任何字符串文字添加前导N
(N'your text'
)。您可以将字符串存储在具有正确配置的边表中,并将其绑定到您的查询中...
更新:广告
正确配置
nvarchar
。
如果您在包含 Unicode 字符的 SQL 脚本中定义字符串文字
,那么您必须使用N'....'
字符串前缀。