2013-11-20 2 views
1

저는 varchar 열에서 검색을 수행해야하는 mysql 데이터베이스가 있습니다. 모든 데이터는 latin1로 인코딩됩니다. 때로는이 열에 서양 악센트 부호가있는 문자가 있습니다 (거의 항상 프랑스어입니다.) 기본 데이터 정렬 (latin1_swedish_ci)을 사용하면 항상 정상적으로 작동합니다. 하지만 이제는 움라우트가 포함 된 일부 데이터에 문제가 있습니다. "nusserhof"를 검색하면 mysql이 "nüsserhof"를 반환하기를 원하지만 그렇지 않습니다. latin1_german1_ci하는 데이터 정렬을 변경하면이 쿼리 단어 "nüsserhof"를 포함하는 모든 행을 반환 작동 예를 들어 가장 간단한 의미에서 문제가 해결되지 :mysql collate latin1_german1_ci가 주문과 작동하지 않습니다

select * from mytable where mycolumn like '%nusserhof%' collate latin1_german1_ci; 

을하지만 order by 절을 추가하면 더 이상 작동합니다. 이 단어 "nüsserhof"를 포함하는 모든 행을 반환하지 않습니다

select * from mytable where mycolumn like '%nusserhof%' order by mycolumn collate latin1_german1_ci; 

놀랍게도, 여기 나 구글을 통해 이것에 대해 아무것도 찾을 수 없습니다. 이 예상되는 동작입니까? 해결 방법은 PHP로 선택을 정렬 한 후 정렬하는 것입니다. 그러나 나는 그것이 작동하도록해야 할 것처럼 보입니다.

답변

0

이 예상되는 동작입니까?

예, 그렇습니다. 스웨덴어

ü 글리프는 문자 tyskt y를 ("독일어 Y") 따라서 latin1_swedish_ci 아래가 아닌 문자 yu의 변형을 나타낸다. 해당 데이터 정렬을 적용하여 where mycolumn like '%nysserhof%'을 검색하면 nüsserhof을 포함한 레코드가 반환됩니다.

독일어에서 글리프 ü은 기본 글리프의 액센트 변형 (특히 움라우트)을 나타내므로 latin1_german1_ci 아래에 예상대로 문자 u의 변형입니다. 따라서이 데이터 정렬에서 검색을 실행할 때 원하는 결과를 얻을 수 있습니다.

우리가 데이터에 대해 적절한 데이터 정렬을 선택해야하는 것은 이러한 종류의 지역적 차이 때문입니다. 일반적으로 일반적인 데이터 정렬은 항상 적절하지 않을 수 있습니다.

COLLATE 키워드의 오해에서 ORDER BY 결과를 적용 할 때 사용자가 반드시 준수 문제 : 그것은 (이 명령 내의 모든 비교를 위해 그 정렬을 사용하는 MySQL을 지시하도록)를 SELECT 명령하지 일부 이다; 오히려 그것은 바로 앞의 문자열의 일부이다. (MySQL에게 바로 앞의 문자열에 대해서만 명시 적 데이터 정렬을 사용하도록 지시한다.)

첫 번째 경우 latin1_german1_ci 데이터 정렬은 '%nusserhof%' 문자열 리터럴에 coercibility이 0으로 적용됩니다. mycolumn (아마도 latin1_swedish_ci 일 것입니다)의 조합은 2의 강제력을가집니다. 전자는 더 낮은 값을 가지므로 표현식을 평가할 때 사용됩니다. 두 번째 경우

는 명시 적 latin1_german1_ci 정렬은 ORDER BY 절에서 mycolumn에 적용된다 : 따라서 정렬 된 결과 'nu' 대신 'ny' 사이 'nz''nv' 사이 'nüsserhof'을 배치합니다.그러나 명시적인 데이터 정렬은 더 이상 WHERE 절 내의 필터 식에 적용되지 않으므로 열의 기본 데이터 정렬이 적용됩니다. mycolumn의 데이터가 독일어의 모든 경우

, 당신은 단순히 기본 데이터 정렬을 변경하고 더 이상 SQL 명령 내에서 명시 적 정렬을 지정에 대해 걱정하지 수 있습니다

ALTER TABLE mytable MODIFY mycolumn <type> COLLATE latin1_german1_ci