Problem mit dem Mustervergleich für Unicode-Zeichen


7

Ich schreibe einen Code, der den Mustervergleich für Unicode-Zeichen verwendet, aber ich stoße auf ein seltsames Problem. Einige Charaktere funktionieren und andere nicht.

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

Das Muster sollte für jedes Zeichen gezogen werden, das nicht az ist, aber aus irgendeinem Grund einige Zeichen nicht fängt. Weiß jemand, warum einige Unicode-Zeichen übereinstimmen und andere nicht?

Antworten:


5

Überprüfen Sie, ob eine binäre Sortierung Ihren Anforderungen entspricht. Hier ist ein kurzer Test.

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)

Die Antworten auf diese ähnliche Frage veranschaulichen die Gefahren, sich bei Bereichsabfragen auf die Sortierreihenfolge der Sortierung zu verlassen. dba.stackexchange.com/questions/34730/…
Iain Samuel McLean Elder
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.