首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在WHERE查询中为Unicode字符串加上'N‘的前缀?

如何避免在WHERE查询中为Unicode字符串加上'N‘的前缀?
EN

Stack Overflow用户
提问于 2019-04-02 09:36:17
回答 2查看 1.4K关注 0票数 4

在我们的数据库中搜索列类型为nvarchar的字符串时,在查询网中指定'N‘前缀是一些结果。把它置之不理并不是。我正在尝试在数据库中搜索一个以前还没有存储任何中文字符串的简体中文字符串。

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

作品:

代码语言:javascript
复制
var text = from asd in Translations.TranslationStrings
            where asd.Text == "嗄法吖无上几"
            select asd;

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

不起作用:

代码语言:javascript
复制
SELECT *
  FROM TranslationStrings
  where Text = '嗄法吖无上几'

如果我在汉字前加上'N‘,就行了。

作品:

代码语言:javascript
复制
SELECT *
  FROM TranslationStrings
  where Text = N'嗄法吖无上几'

请原谅我的汉字,我只是随便打了些东西。我的问题是,在执行查询时,我能做些什么来避免包含'N‘前缀吗?

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-02 09:57:05

如@sworkalot所述: .Net的默认设置是Unicode,这就是不需要指定它的原因。Sql Manager的情况并非如此。 如果未指定Sql,则假定您根据DB中指定的排序规则使用asci。 因此,在使用Server时,需要使用N‘ https://sqlquantumleap.com/2018/09/28/native-utf-8-support-in-sql-server-2019-savior-false-prophet-or-both/

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

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
Varchar VarcharWithN    NVarchar    NVarcharWithN
?       ?               ?           嗄

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

NVARCHAR数据类型为每个字符存储2个字节,而VARCHAR只存储1个字符(在第二个SELECTVARBINARY强制转换中可以看到这一点)。由于汉字表示需要两个字节来存储,所以必须使用NVARCHAR来存储它们。如果您尝试将它们填充到VARCHAR中,它将被存储为?,您将丢失原始字符信息。在第三个例子中也会出现这种情况,因为文字中没有N,所以在实际将值赋值给变量之前,它被转换为VARCHAR

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

如果您能够解释为什么要省略N前缀,我们可以解决这个问题,尽管我认为在这种情况下没有工作。

票数 1
EN

Stack Overflow用户

发布于 2019-04-02 09:41:47

.Net的默认设置是Unicode,这就是不需要指定它的原因。Sql Manager的情况并非如此。

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

因此,在使用Server时,需要使用N‘

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55471461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档