2012-05-25 2 views
2

열에 URL을 저장하고 싶습니다. RFC 3986에 따르면 US-ASCII는 URL을 구성하는 문자 집합입니다.T-SQL에서 US-ASCII 문자를 일치시키는 방법은 무엇입니까?

SQL Server에는 US-ASCII 문자 집합의 모든 문자를 인코딩 할 수있는 VARCHAR 형식과 코드 페이지에 종속적 인 128 개가 있습니다.

CHECK 제약 조건을 사용하여 열의 값에 US-ASCII 문자 집합의 인쇄 가능한 문자 만 포함되도록하고 싶습니다. 즉, 문자열의 모든 문자에 대해 ASCII(@char) >= 32 AND ASCII(@char) < 127입니다.

체크 제약 조건에서이를 수행하는 LIKE 식을 사용할 수 있다고 생각하지만 올바른 패턴을 찾을 수 없습니다. 저는 Itzik Ben-Gan이 허용 한 범위를 벗어나는 캐릭터를 맞추려고 시도하고 있습니다. 그는 그의 기사 Can I convert this string to an integer?에 선물했습니다. 내 테스트 하니스

은 내가 열 테이블 패턴 @Patterns LIKE 연산자와 함께 사용하기에 삽입 후보 테이블 @TestData를 생성하고 I는 각각의 후보에 대해 각각 패턴 매칭의 결과를 선택

@Patterns에 삽입되는 첫 번째 행은 Itzik이 비 숫자 문자를 일치시키는 데 사용하는 패턴과 같습니다. 두 번째 행은 인쇄 가능한 US-ASCII 문자 범위를 벗어나는 문자에이 방법을 적용하려는 시도입니다. 후보는 숫자를 포함하고 있기 때문에

예상대로
ID String             Pattern  Match 
--- -------------------------------------------------------- ------------ ------ 
1 €ÿ              %[^0-9]%  0 
2 ab3              %[^0-9]%  0 
3 http://www.google.com/         %[^0-9]%  0 
4 http://www.example.com/düsseldorf?neighbourhood=Lörick %[^0-9]%  0 
5 1234              %[^0-9]%  1 
6 €ÿ              %[^ -~]%  0 
7 ab3              %[^ -~]%  0 
8 http://www.google.com/         %[^ -~]%  0 
9 http://www.example.com/düsseldorf?neighbourhood=Lörick %[^ -~]%  0 
10 1234              %[^ -~]%  0 

가, 5 행이 일치 :

나는 위의 배치를 실행

, 나는 다음과 같은 결과 세트를받을 수 있습니다. 1 행부터 4 행까지의 후보는 숫자 만 포함하지 않으므로 패턴과 일치하지 않습니다.

예상대로 6 행의 후보는 '높은 ASCII'문자가 포함되어 있기 때문에 패턴과 일치하지 않습니다.

행 7, 8 및 10의 후보는 인쇄 가능한 US-ASCII 문자 만 포함되어 있기 때문에 일치시킬 것으로 예상됩니다. 그러나 이것들은 일치하지 않습니다.

LIKE 표현의 패턴에 어떤 문제가 있습니까?

+2

이진 부수 항을 사용해야합니다. 패턴 구문의 범위는 데이터 정렬 순서에 따라 결정됩니다. –

+0

[SQL Server 2008 테이블을 쿼리하여 유니 코드 문자가 포함 된 열의 값을 찾을 수 없음] (http://stackoverflow.com/questions/5184429/querying-a-sql-server-2008-table-to-find- 값을 포함한 열 단위 유니 코드 -c) –

+0

중복이 아닙니다. 상황은 다르다. 그러나 해결책은 같습니다! –

답변

3

질문 주석과 similar question에 대한 답변에서 제안한 것처럼 이진 데이터 정렬 절을 사용해야합니다.

나는이에 select 문을 변경하는 경우 :

SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID, 
    String, 
    Pattern, 
    CASE WHEN String NOT LIKE Pattern COLLATE Latin1_General_BIN THEN 1 ELSE 0 END AS [Match] 
FROM @TestData CROSS JOIN @Patterns; 

을 나는 다음과 같은 결과 집합을 얻을 :

ID String             Pattern  Match 
--- -------------------------------------------------------- ------------ ------ 
1 €ÿ              %[^0-9]%  0 
2 ab3              %[^0-9]%  0 
3 http://www.google.com/         %[^0-9]%  0 
4 http://www.example.com/düsseldorf?neighbourhood=Lörick %[^0-9]%  0 
5 1234              %[^0-9]%  1 
6 €ÿ              %[^ -~]%  0 
7 ab3              %[^ -~]%  1 
8 http://www.google.com/         %[^ -~]%  1 
9 http://www.example.com/düsseldorf?neighbourhood=Lörick %[^ -~]%  0 
10 1234              %[^ -~]%  1 

지금 열이 매치가 예상 값을 포함합니다.

+0

그리고 URL을 포함하는 열의 CHECK 제약 조건은 다음과 같습니다 :'CHECK (URL 'NOT LIKE'% [^ - ~] % 'COLLATE Latin1_General_BIN)' –

관련 문제