如何摆脱为Unicode字符串添加'N'的WHERE查询前缀?

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

在我们的数据库中搜索列为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'前缀?

非常感谢你!

sql sql-server entity-framework linq chinese-locale
2个回答
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上的SELECT上看到这个)。由于中文字符表示需要存储2个字节,因此必须使用NVARCHAR来存储它们。如果您尝试将它们填入VARCHAR,它将被存储为?,您将丢失原始字符信息。这也发生在第3个例子中,因为文字没有N所以在将值实际赋值给变量之前它被转换为VARCHAR

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

如果你能解释你想省略N前缀的原因,我们可以解决这个问题,虽然我相信在这种特殊情况下没有解决方法。


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/

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