在我们的数据库中搜索列类型为nvarchar的字符串时,在查询网中指定'N‘前缀是一些结果。把它置之不理并不是。我正在尝试在数据库中搜索一个以前还没有存储任何中文字符串的简体中文字符串。
使用数据库的EntityFramework应用程序正确检索字符串,LINQ查询也在应用程序中工作。但是,在SQLServer2014ManagementStudio中,当我对字符串执行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‘前缀吗?
非常感谢!
发布于 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/
请查看这些示例,密切注意数据类型和所分配的值:
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 0xC455NVARCHAR数据类型为每个字符存储2个字节,而VARCHAR只存储1个字符(在第二个SELECT的VARBINARY强制转换中可以看到这一点)。由于汉字表示需要两个字节来存储,所以必须使用NVARCHAR来存储它们。如果您尝试将它们填充到VARCHAR中,它将被存储为?,您将丢失原始字符信息。在第三个例子中也会出现这种情况,因为文字中没有N,所以在实际将值赋值给变量之前,它被转换为VARCHAR。
正因为如此,在将这些字符键入为文字时,需要添加N前缀,因此SQL知道您正在键入需要2字节表示的字符。因此,如果要对NVARCHAR列进行比较,请始终添加N前缀。您可以更改数据库排序规则,但建议始终使用与排序规则无关的适当数据类型,以便在使用不同数据库的编码时不会出现问题。
如果您能够解释为什么要省略N前缀,我们可以解决这个问题,尽管我认为在这种情况下没有工作。
发布于 2019-04-02 09:41:47
.Net的默认设置是Unicode,这就是不需要指定它的原因。Sql Manager的情况并非如此。
如果未指定Sql,则假定您根据DB中指定的排序规则使用asci。
因此,在使用Server时,需要使用N‘
https://stackoverflow.com/questions/55471461
复制相似问题