使用nvarchar的 WHERE子句无法区分某些特殊字符

编程语言 2026-07-09

我正在处理一个数据库,其中nvarchar列包含一些特殊字符。具体来说,里面有用特殊字符写成的文本,比如Twitter或 Discord的字体生成器所生成的文本(比如 𝚖𝚘𝚗𝚘𝚜𝚙𝚊𝚌𝚎 或 𝐦𝐚𝐭𝐡 𝐬𝐞𝐫𝐢𝐟 𝐛𝐨𝐥𝐝)。

用常规方式搜索该字符串通常不会返回结果。我从 这个回答 中理解到,必须在字符串前面加上N,才能让特殊字符被识别。

然而,当我像这样向SQL Server编写查询时:

SELECT field
FROM table
WHERE field = N'𝐭𝐞𝐱𝐭'

该查询不仅返回 𝐭𝐞𝐱𝐭,还返回了大量完全不同的单词,这些单词既以特殊字体书写,也以普通文本书写。

此外,如果我尝试使用 field=N'' 搜索一个空字符串,它会返回一组看起来完全不同、似乎随机的、包含特殊字符的文本。

我该如何搜索包含特定特殊字符的字符串?

解决方案

问题在于排序规则(collation),SQL_Latin1_General_CP1_CI_AS 对补充字符的支持不完全,尤其在进行比较时,因此当你比较两个包含它们的值时,结果会显得怪异或不尽如人意。

如果你需要处理包含这类字符的数据并进行匹配,请使用对它们支持更好的排序规则,例如 Latin1_General_100_CI_AS_SC。在哪些地方更改排序规则取决于你的需求;你可能希望修改数据库的整个排序规则,或只是修改该列的排序规则。

不过,你可以在下面的示例中看到,对于 YourTable 返回了2 行,而对于 MyTable 只返回1 行,这是因为排序规则不同所致。

CREATE TABLE dbo.YourTable (field nvarchar(20));
GO
CREATE TABLE dbo.MyTable (field nvarchar(20) COLLATE Latin1_General_100_CI_AS_SC);
GO
INSERT INTO dbo.YourTable (field)
VALUES(N'𝐭𝐞𝐱𝐭'),(N'𝐭𝐞𝐞𝐭');
GO
INSERT INTO dbo.MyTable (field)
VALUES(N'𝐭𝐞𝐱𝐭'),(N'𝐭𝐞𝐞𝐭');
SELECT field
FROM YourTable
WHERE field = N'𝐭𝐞𝐱𝐭';
字段
𝐭𝐞𝐱𝐭
𝐭𝐞𝐞𝐭
SELECT field
FROM MyTable
WHERE field = N'𝐭𝐞𝐱𝐭';
字段
𝐭𝐞𝐱𝐭

db<>fiddle

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章