문제

테이블을 만들고 Collation을 설정했습니다 UTF8 필드에 고유 한 색인을 추가 할 수 있도록. 이제 사례 무감각 검색을해야하지만 Collate 키워드로 일부 쿼리를 수행하면 다음을 수행했습니다.

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;

오류 1253 (42000) : Collation 'utf8_general_ci'는 문자 세트 'latin1'에 유효하지 않습니다.

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;

오류 1267 (Hy000) : Collations (UTF8_BIN, 암시 적) 및 (Latin1_General_ci, Expricit)의 불법 혼합 '='

나는 SQL을 처음 접했기 때문에 누군가가 도울 수 있는지 궁금합니다.

도움이 되었습니까?

해결책

MySQL의 문자열에는 a 캐릭터 세트와 콜라이트. UTF8은 캐릭터 세트이며 UTF8_BIN은 콜라이트 중 하나입니다. 문자열 리터럴을 UTF8 열과 비교하려면 _Charset 표기법으로 접두사를 통해 UTF8로 변환하십시오.

_utf8 'Something'

이제 Collation은 일부 캐릭터 세트에만 유효합니다. 경우-예민한 UTF8의 Collation은 UTF8_BIN 인 것으로 보이며 다음과 같이 지정할 수 있습니다.

_utf8 'Something' collate utf8_bin

이러한 변환을 사용하면 쿼리가 작동해야합니다.

select * from page where pageTitle = _utf8 'Something' collate utf8_bin

_charset 접두사는 문자 그럴로 작동합니다. 필드의 문자 세트를 변경하려면 전환이 있습니다 ... 사용이 있습니다. 이것은 pagetitle 필드를 다른 문자 세트로 변환하려는 경우에 유용합니다.

select * from page 
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'

'탭'이라는 테이블에서 'col'이라는 열에 대한 캐릭터와 콜로레이션을 보려면 시도해보십시오.

select distinct collation(col), charset(col) from TAB

모든 문자 세트 및 콜라이트 목록은 다음과 같이 찾을 수 있습니다.

show character set
show collation

UTF8에 대한 모든 유효한 콜로레이션은 다음과 같이 찾을 수 있습니다.

show collation where charset = 'utf8'

다른 팁

또한 "Collate UTF8_GENERAL_CI"또는 "COLLATE LATIN1_GENERAL_CI"를 사용하는 경우 "Force"Collate- 이러한 변환은 기존 인덱스의 사용을 방지합니다! 이것은 향후 성능의 병목 현상 일 수 있습니다.

이것을 시도해보십시오

*에서 선택하십시오 users 상단 (상부)name) = upper ( 'josé')는 UTF8_BIN을 충족시킵니다.

선택을 할 때 왜 Collation을 명시 적으로 변경 해야하는지 물어봐도 될까요? 정렬 할 때 레코드를 검색하려는 방식으로 만 담당하는 이유는 무엇입니까?

검색에 민감한 문제는 바이너리 콜레이션이 있다는 것입니다. 대신 일반 Collation을 사용하십시오. 사례 민감도 및 콜라이트에 대한 자세한 내용은 여기를 참조하십시오.문자열 검색의 경우 사례 감도

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top