我怎样才能摆脱必须为 Unicode 字符串添加 'N' 前缀的 WHERE 查询?

How can I get rid of having to prefix a WHERE query with 'N' for Unicode strings?

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

非常感谢!

.Net 的默认值为 Unicode,因此您无需指定它。 Sql 经理不是这种情况。

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

因此,当从 Sql 服务器工作时,您需要使用 N'

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

As @sworkalot has mentioned below:

The default for .Net is Unicode, that's why you don't need to specify it. This is not the case for Sql Manager.

If not specified Sql will assume that you work with asci according to the collation specified in your DB.

Hence, when working from Sql Server you need to use 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 个字节(您可以在第 2 个 SELECTVARBINARY 中看到这一点)。由于汉字表示需要存储 2 个字节,因此必须使用 NVARCHAR 来存储它们。如果您尝试将它们填充到 VARCHAR 中,它将被存储为 ? 并且您将丢失原始字符信息。这也发生在第三个例子中,因为文字没有 N 所以它在实际赋值给变量之前被转换为 VARCHAR

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

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