'where'에서 악센트 무시


17

데이터베이스에는 caron / hatschek을 사용하여 여러 항목이 있습니다. 이제 사용자는없이 항목을 검색 할 때 caron / hatschek을 포함한 항목을 찾고 싶습니다. 간단한 예를 통해이를 보여 드리겠습니다.

데이터베이스에는 항목이 있습니다 (이름과의 연락)

Millière

따라서이 이름은 거주 국가에서 정확합니다.

우리나라에는 caron / hatschek 문자가 없으므로 사용자가을 검색합니다 Milliere. è일치하지 않는 결과가 나타나지 않습니다 e.

나는이 같이 실현 될 수있는 방법을 몰라 é, è, ê많은 사람들이 더 사용할 수 있습니다 (이는 편지에 대한 예입니다 e...).

(다른 방법은 모든 문자를 기본 문자로 caron / hatschek으로 간단히 바꿀 수 있기 때문에 훨씬 쉬울 것입니다. 분명히, 사용자는 절름발이 아닌 데이터베이스에서 올바른 버전의 이름을 원합니다.)


문자 "è"는 캐논 / 헤 스크가없고, 악센트가 있습니다. 캐논 / 헤스 크는 "ě"입니다. "액센트가있는 문자"또는 이와 유사한 것을 의미합니까? 아니면 구체적으로 카론 / 하세 크 악센트를 의미합니까?
psmears

"사인"이있는 문자를 의미합니다 (죄송합니다. 실제 이름은 모르겠습니다.
lumo

답변:


31

이 문제는 악센트를 구분하지 않는 데이터 정렬을 사용하여 해결할 수 있습니다 .

데이터베이스는 아마도 AS (Accent Sensitive) 데이터 정렬을 사용하고 있으므로 기본적으로 악센트를 포함하여 정확히 일치하는 항목을 검색합니다.

비교와 함께 데이터 정렬을 지정하여 WHERE 절에 데이터베이스 기본값 이외의 다른 데이터 정렬을 사용하도록 지시 할 수 있습니다.

에서 이 dbfiddle 나는 LATIN1 정렬을 사용하는 예제를 생성하지만 당신은 당신이 당신의 열이 현재 사용중인 데이터 정렬을 위해 AI에 AS를 변경하여 사용하는 데이터 정렬과 같은 방법을 사용할 수 있습니다.

열이 사용중인 데이터 정렬과 일치하는 악센트 비 감응 데이터 정렬을 사용하십시오. 예를 들어, 컬럼을 사용 하는 경우 비 SQL_ 데이터 정렬의 동작이 악센트 비 감도보다 더 많은 방식이 다르므로 사용자가 예상하지 못할 수 있으므로이 둘의 변형을 SQL_Latin1_General_CP1_CI_AS사용 하거나 사용 SQL_Latin1_General_CP1_CI_AI하지 Latin1_General_CI_AS않거나 사용 Latin1_General_100_CI_AS하십시오.

에서 현재 데이터 정렬을 확인할 수 있습니다 sys.columns.

CREATE TABLE testaccent (name nvarchar(50));
GO
INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
GO
-- returns Miliere
SELECT * FROM testaccent WHERE name = 'Milliere';

-- returns both
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI

--only returns Miliere
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS

자세한 정보는 SQL Server 데이터 정렬 사용을 읽으십시오 .

그런 다음 다시 당신은 아마 (로이 데이터 정렬을 사용하여 정렬 싶어 peufeu "E"와 그 "é"종류를 확인하기 위해 주석에서 언급). 그렇지 않으면 알파벳순으로 결과를 페이지 매김하는 사람은 예상 한 위치에 "é"가 없다는 사실에 놀라게 될 것입니다. 그러나이 쿼리를 터치하려는 경우에도 COLLATE절을 추가 할 수 있습니다 ORDER BY.

의견에서 Solomon Rutzky 가 언급했듯이 , 이것이 단지 하나 또는 몇 개의 열에 만 영향을 미치는 경우, 또 다른 옵션은 단순히 "이름"열을 반복하고 악센트에 둔감 한 데이터 정렬을 제공하고 계산 된 색인을 생성하는 비 지속 계산 열을 만드는 것입니다 기둥. 이렇게하면 쿼리 내에서 데이터 정렬을 변경하여 발생하는 스캔을 피할 수 있습니다. 그런 다음 쿼리는 새 열을 필터링해야합니다.

다음과 같은 것 :

ALTER TABLE 
dbo.[table_name] ADD [SearchName] datatype_of_name_column 
AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI)); 

CREATE INDEX [IX_table_name_SearchName] 
ON dbo.[table_name] ([SearchName] ASC);

또는 jyao가 선호하는 대로 계산 열을 추가하는 대신보기를 만들 수도 있습니다 .


1
Tom : 에서 사용하고있는 Accent-Insensitive 버전의 Collation 사용해야한다고 강조하고 강조합니다 (3 절에서 언급 한 데이터베이스의 기본 데이터 정렬은이 질문과 관련이 없습니다). 열 이을 사용하는 경우 비 콜 레이션 의 동작이 악센트 비 감도보다 더 다양하므로 사용자가 예상하지 못할 수 있으므로이 둘의 변형을 SQL_Latin1_General_CP1_CI_AS사용 하거나 사용 SQL_Latin1_General_CP1_CI_AI하지 Latin1_General_CI_AS않거나 사용 Latin1_General_100_CI_AS하십시오 SQL_. 데이터 정렬은에서 찾을 수 있습니다 sys.columns.
Solomon Rutzky

@SolomonRutzky 좋은 제안
Tom V-Team Monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.