2011-12-05 2 views
3

스페인어로 된 단어가있는 테이블이 있습니다 (INT id_word, VARCHAR (255) word). 테이블이이 기록을 가지고 있다고 가정하자 :SQL - 정확한 일치 만 반환하는 방법 (특수 문자)

  • 1 카사를
  • 2 pantalon
  • 나는 단어 pantalón를 검색 할 경우

(특수 문자 오와) 그것을해야 하지 반환 어떤 행. 정확히 일치하는 것을 어떻게 만듭니 까? 현재 2 행을 반환 중입니다.

SELECT * FROM words WHERE word='pantalón'; 

감사!

해결책ifx에서 단어 필드의 정렬을 utf8_bin으로 변경했습니다.

+1

유니 코드 및 데이터 정렬에 대한 유용한 정보 : http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html 테이블 인코딩/데이터 정렬이란 무엇입니까? – biziclop

+0

안녕하세요 @biziclop - im utf8_general_ci를 사용하여 – andufo

답변

4

이렇게되는 이유는 데이터 정렬 때문입니다. 액센트가 민감한 (이 경우 원하는) 데이터와 액센트를 구분하지 않는 데이터 (현재 구성한 데이터)가 있습니다. 대/소문자를 구분하며 대/소문자를 구분하지 않는 데이터 정렬도 있습니다.

create table test (
    id int identity(1,1), 
    value nvarchar(100) collate SQL_Latin1_General_Cp437_CI_AS 
) 

insert into test values ('casa') 
insert into test values ('pantalon') 

select value collate SQL_Latin1_General_Cp437_CS_AS from test where value = 'pantalón' 

아래의 코드는 잘못된 결과를 생성합니다 :

다음 코드는 올바른 결과 생산

drop table test 
go 

create table test (
    id int identity(1,1), 
    value nvarchar(100) collate SQL_Latin1_General_Cp437_CI_AI 
) 
insert into test values ('casa') 
insert into test values ('pantalon') 

select value collate SQL_Latin1_General_Cp437_CS_AS from test where value = 'pantalón' 

여기서 핵심은 데이터 정렬입니다 - AI는 악센트를 의미 -insensitive, 은 악센트 구분을 의미합니다.

+0

테이블에 실제로 스페인어, 중국어 및 포르투갈어 단어가 있기 때문에 나는 utf8_general_ci를 선택했습니다. 모든 언어 특수 문자를 처리 할 수있는 bs 액센트 구분 데이터 정렬은 무엇입니까? 나는 그것을 utf8_bin으로 바꾸었고 정상적으로 작동했다. – andufo

+1

utf8_bin이 가장 정확하지만 문자열의 각 문자의 이진 값이 비교/정렬에 사용되므로 이러한 작업 중에 성능에 영향을 미칠 수 있습니다. – ifx

0

나는이 문제를 우리 언어에서도 가지고있다. 그래서 나는 이름을 위해 2 개의 coulmns를 가지고있다. 나는 하나의 SearchColumn과 다른 하나의 ViewColumn을 명명했다. 데이터를 저장할 때 특수 문자를 다른 문자로 대체한다. 사용자가 동일한 기능을 가진 무언가를 검색하려고 할 때 SearchColumn에서 변경 사항을 검색하면 검색이 일치하면 ViewColumn 값이 표시됩니다.

+0

그것은 나를 위해 너무 무거울 것이다. 나는 문자 그대로 수천 개의 행을 가지고있다. 데이터 정렬 변경이 효과적입니다! – andufo