sql - 对于 Unicode 字符串,我怎样才能摆脱在 WHERE 查询中添加“N”前缀?
问题描述
在我们的数据库中搜索列类型为 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
在 2nd 的演员表中看到这一点SELECT
)。由于汉字表示需要2个字节来存储,所以你必须使用NVARCHAR
来存储它们。如果您尝试将它们填充到 a 中VARCHAR
,它将被存储为?
并且您将丢失原始字符信息。这也发生在第三个示例中,因为文字没有,N
所以VARCHAR
在实际将值分配给变量之前将其转换为。
正因为如此,在将这些字符作为文字输入时需要添加N
前缀,因此 SQL 引擎知道您正在输入需要 2 字节表示的字符。因此,如果您要对列进行比较,请NVARCHAR
始终添加N
前缀。您可以更改数据库排序规则,但建议始终使用独立于排序规则的正确数据类型,以便在不同数据库上使用编码时不会遇到问题。
如果您能解释为什么要省略N
前缀的原因,我们可能会解决这个问题,尽管我相信在这种特殊情况下没有解决方法。
推荐阅读
- javascript - 如何在情节中为颜色条设置不均匀的刻度值
- python - pandas - 筛选在 groupby 中至少有一列包含非空值的组
- julia - 如何对 Julia 进行多重插补?
- forms - Symfony 4 表单处理
- three.js - 物体可以隐藏在其他透明物体后面吗?
- python - 读取文件并匹配多行
- python-3.x - Python 计算前导和尾随空格
- docker - docker如何连接到外部DNS
- performance - ff4j 和 togglz 之间的性能比较
- java - Java MySQLSyntaxErrorException?为什么我的 SELECT 语句不正确?