如何摆脱对Unicode字符串的WHERE查询添加“ N”前缀的麻烦?

时间:2019-04-02 09:36:18

标签: sql sql-server entity-framework linq chinese-locale

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

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

作品:

PyTorch

不起作用:

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

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

如果我在汉字前面加上“ N”,则可以。

作品:

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

请原谅汉字,我只是随机输入了一些东西。我的问题是,在执行查询时是否可以做些不必添加'N'前缀的事情?

非常感谢您!

2 个答案:

答案 0 :(得分:1)

.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/

答案 1 :(得分:1)

  

@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的{​​{1}}强制转换中看到它)。由于汉字表示形式需要存储2个字节,因此必须使用SELECT来存储它们。如果尝试将它们填充到NVARCHAR中,它将被存储为VARCHAR,并且您将丢失原始字符信息。在第三个示例中也会发生这种情况,因为文字没有?,因此在将值实际分配给变量之前将其转换为N

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

如果您可以解释为什么省略N前缀的原因,我们可以解决,尽管我认为在这种情况下无法解决。