在我们的数据库中搜索列为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'前缀?
非常感谢你!
正如@sworkalot在下面提到的:
.Net的默认值是Unicode,这就是您不需要指定它的原因。对于Sql Manager,情况并非如此。
如果未指定,Sql将假定您根据数据库中指定的排序规则使用asci。
因此,从Sql Server工作时,您需要使用N'
查看这些示例,密切关注数据类型和分配的值:
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
前缀的原因,我们可以解决这个问题,虽然我相信在这种特殊情况下没有解决方法。
.Net的默认值是Unicode,这就是您不需要指定它的原因。对于Sql Manager,情况并非如此。
如果未指定,Sql将假定您根据数据库中指定的排序规则使用asci。
因此,从Sql Server工作时,您需要使用N'