首页 > 解决方案 > 对于 Unicode 字符串,我怎样才能摆脱在 WHERE 查询中添加“N”前缀?

问题描述

在我们的数据库中搜索列类型为 nvarchar 的字符串时,在查询中指定“N”前缀会得到一些结果。离开它不会。我正在尝试在以前没有存储任何中文字符串的数据库中搜索简体中文字符串。

使用数据库的 EntityFramework 应用程序正确检索字符串,并且 LINQ 查询也在应用程序中工作。但是,在 SQL Server 2014 Management Studio 中,当我对字符串执行 SQL 查询时,除非我为 unicode 指定“N”前缀,否则它不会显示。(即使列是 nvarchar 类型)

作品:

var text = from asd in Translations.TranslationStrings
            where asd.Text == "嗄法吖无上几"
            select asd;

            MessageBox.Show(text.FirstOrDefault().Text);

不工作:

SELECT *
  FROM TranslationStrings
  where Text = '嗄法吖无上几'

如果我在汉字前面加上'N'就可以了。

作品:

SELECT *
  FROM TranslationStrings
  where Text = N'嗄法吖无上几'

请原谅汉字,我只是随便打了一些东西。我的问题是,在进行查询时我可以做些什么来不必包含“N”前缀?

非常感谢!

标签: sqlsql-serverentity-frameworklinqchinese-locale

解决方案


正如@sworkalot 在下面提到的:

.Net 的默认值是 Unicode,这就是您不需要指定它的原因。这不是 Sql Manager 的情况。

如果未指定,Sql 将假定您根据数据库中指定的排序规则使用 asci。

因此,从 Sql Server 工作时,您需要使用 N'

https://sqlquantumleap.com/2018/09/28/native-utf-8-support-in-sql-server-2019-savior-false-prophet-or-both/

查看这些示例,密切注意数据类型和分配的值:

DECLARE @Varchar VARCHAR(100) = '嗄'
DECLARE @VarcharWithN VARCHAR(100) = N'嗄' -- Has N prefix

DECLARE @NVarchar NVARCHAR(100) = '嗄'
DECLARE @NVarcharWithN NVARCHAR(100) = N'嗄' -- Has N prefix


SELECT
    Varchar = @Varchar,
    VarcharWithN = @VarcharWithN,
    NVarchar = @NVarchar,
    NVarcharWithN = @NVarcharWithN

SELECT
    Varchar = CONVERT(VARBINARY, @Varchar),
    VarcharWithN = CONVERT(VARBINARY, @VarcharWithN),
    NVarchar = CONVERT(VARBINARY, @NVarchar),
    NVarcharWithN = CONVERT(VARBINARY, @NVarcharWithN)

结果:

Varchar VarcharWithN    NVarchar    NVarcharWithN
?       ?               ?           嗄

Varchar VarcharWithN    NVarchar    NVarcharWithN
0x3F    0x3F            0x3F00      0xC455

NVARCHAR数据类型为每个字符存储 2 个字节,而VARCHAR仅存储 1 个(您可以VARBINARY在 2nd 的演员表中看到这一点SELECT)。由于汉字表示需要2个字节来存储,所以你必须使用NVARCHAR来存储它们。如果您尝试将它们填充到 a 中VARCHAR,它将被存储为?并且您将丢失原始字符信息。这也发生在第三个示例中,因为文字没有,N所以VARCHAR在实际将值分配给变量之前将其转换为。

正因为如此,在将这些字符作为文字输入时需要添加N前缀,因此 SQL 引擎知道您正在输入需要 2 字节表示的字符。因此,如果您要对列进行比较,请NVARCHAR始终添加N前缀。您可以更改数据库排序规则,但建议始终使用独立于排序规则的正确数据类型,以便在不同数据库上使用编码时不会遇到问题。

如果您能解释为什么要省略N前缀的原因,我们可能会解决这个问题,尽管我相信在这种特殊情况下没有解决方法。


推荐阅读