2016-10-07 2 views
1

PHP와 MySQL로 검색을 구현했습니다. 현재 테이블의 콜레이트는 "utf8_unicode_ci"입니다. 문제는이 데이터 정렬을 사용하면 "ä" = "a"입니다. 부 단위를 "utf_bin"으로 변경하면 모든 작업이 수행되지만 해당 데이터 정렬은 중요하지 않습니다.검색을 위해 가장 좋은 MySQL 조합

그래서 "upper" 또는 "lower" :

와 SQL 또는 PHP 코드를 변경 아니오 모두는 최선의 MySQL은 내 검색 무엇을 대조되고 싶어?

답변

0

일반적으로 코드에서 lower을 사용하면 모든 종류의 문자 및 언어에서 사용할 수있는 안전한 접근 방식입니다. 일부 언어의 경우 비교를 지원하는 특수 데이터 정렬이 있지만 독자적으로 몇 가지 문제가있을 수 있습니다. 'ä' = 'Ä' != 'A'의 경우 utf8_german2_ci (독일 전화 번호부 주문)을 사용할 수 있습니다. 이 비교에서 동일하게 다음과 같은 문자를 처리합니다 :

Ä = Æ = AE 
Ö = Œ = OE 
Ü = UE 
ß = ss 

그러나 비교 (예를 =, <, >) 문자 그대로 의미 : 데이터 정렬이 실제로 정렬에 관련이 있기 때문에,이 조합은 이상한 sideeffect를 가지 'AE' = 'Ä' 있지만 'AE' like 'Ä'! 코드에서 단순히 lower을 추가하는 것보다 코드를 고려하기가 더 어려울 수 있으며 나중에 두뇌 트위스트 효과가 발생할 수 있습니다. 하지만 그걸로 살아갈 수 있고 독일어 움라우트 이외의 다른 특수 문자를 사용할 필요가 없다면 (예 : 'à', 'á''å'은 모두 'a'으로 처리됩니다.) 시도해 볼 수 있습니다.

예 :

create table germanumlaut (
    word varchar(20) collate utf8_german2_ci 
); 

insert into germanumlaut (word) 
values ('Ä'), ('ä'), ('A'), ('á'), ('AE'); 

select * from germanumlaut where word = 'A'; 
-- result: 'A', 'á', as 'á' is not a german umlaut and treated as 'a' 

select * from germanumlaut where word = 'Ä'; 
-- result: 'Ä', 'ä', 'AE', as 'AE' = 'Ä' 

select * from germanumlaut where word > 'Ad'; 
-- result: 'Ä', 'ä', 'AE', as 'Ä' = 'AE' 

select * from germanumlaut where word like 'A'; 
-- result: 'A', 'á' 

select * from germanumlaut where word like 'Ä'; 
-- result: 'Ä', 'ä' 

select * from germanumlaut where word like 'A%'; 
-- result: 'A', 'á', 'AE' 
+0

[_This_ (http://mysql.rjweb.org/utf8_collations.html) 그 german2, 아이슬란드 어, 덴마크어, 에스토니아어, 슬로바키아어, 지적 스웨덴 유일한 UTF8 정렬되어 'Ä'를'A'와 같지 않은 것으로 간주합니다. –

관련 문제