Unicode 字符的模式匹配问题

Ken*_*her 7 sql-server pattern-matching sql-server-2014 unicode

我正在编写一段对 unicode 字符使用模式匹配的代码,但我遇到了一个奇怪的问题。有些字符有效,有些则无效。

DECLARE @Pattern nvarchar(50) = N'%[^a-z]%' -- Simple pattern
SELECT PatIndex(@Pattern, nchar(46797)), nchar(46797) -- Works
SELECT PatIndex(@Pattern, nchar(14843)), nchar(14843) -- Doesn't Work
Run Code Online (Sandbox Code Playgroud)

该模式应该适用于任何不是 az 的字符,但由于某种原因它没有捕捉到某些字符。有谁知道为什么某些 unicode 字符会匹配而其他字符则不会?

小智 5

看看做一个二进制整理是否符合你的需要。这是一个快速测试。

USE Tempdb  
GO

IF OBJECT_ID('PattMatch') IS NOT NULL  
BEGIN  
  DROP TABLE PattMatch  
END  
GO  

CREATE TABLE PattMatch (COL1 NVARCHAR(50))  
GO  

INSERT INTO PattMatch  
VALUES (nchar(46797)),(nchar(14843)),('ddddddd*'),('lettersand9999')  
GO  

DECLARE @Pattern nvarchar(50) = N'%[^a-z]%'   
SELECT PatIndex(@Pattern, COL1 COLLATE Latin1_General_BIN2), COL1 FROM PattMatch  
GO  

DROP TABLE PattMatch   
GO  

--your test  
DECLARE @Pattern nvarchar(50) = N'%[^a-z]%'  
SELECT PatIndex(@Pattern, nchar(46797) COLLATE Latin1_General_BIN2)  
SELECT PatIndex(@Pattern, nchar(14843) COLLATE Latin1_General_BIN2)
Run Code Online (Sandbox Code Playgroud)