2017-04-12 12 views
2

다음 SQL 문은 MySQL에서 true을 어떻게 반환합니까?어떻게이 문자 순서 비교가 true를 리턴합니까?

SELECT 'SeP' = 'sęp'; 

mysql> select 'SeP' = 'sęp'; 
+----------------+ 
| 'SeP' = 'sęp' | 
+----------------+ 
|    1 | 
+----------------+ 
1 row in set (0.00 sec) 

내 데이터베이스의 문자 집합과 데이터 정렬은 다음과 같습니다.

mysql> select @@character_set_database, @@collation_database, @@collation_connection; 
+--------------------------+----------------------+------------------------+ 
| @@character_set_database | @@collation_database | @@collation_connection | 
+--------------------------+----------------------+------------------------+ 
| utf8mb4     | utf8mb4_general_ci | utf8_general_ci  | 
+--------------------------+----------------------+------------------------+ 
1 row in set (0.00 sec) 
+0

사양을 확인해야하지만 두 문자가 특정 언어에 구속되지 않고 일반적인 데이터 정렬에서 동일하다고 간주하는 것이 타당합니다. –

+0

'CASE WHEN'을 시도하면이 기능을 사용할 수 있습니다. –

+0

@SagarGangwal 시도해 볼 수는 있지만 많이 사용하지는 않을 것입니다. – Shadow

답변

7

때문에 두 문자열이, 당신은 대소 문자를 구분하지 (조합 이름의 끝에 ci을이를 나타냅니다)가 및 일반 정렬, 따라서 MySQL은 경우에 문자를 구분 2 문자열을 비교하여 일반적으로 악센트를 구분 방법 똑같다. Case sensitivity in string searches

MySQL의 설명서는 말한다 : 이진이 아닌 문자열에 대한

(CHAR, VARCHAR, TEXT), 문자열 검색이 비교 피연산자의 데이터 정렬을 사용합니다. 이진 문자열 (BINARY, VARBINARY, BLOB)의 경우 비교는 피연산자의 바이트 값을 사용합니다. 이는 알파벳 문자의 경우 비교가 대소 문자를 구분한다는 것을 의미합니다.

이진 문자열과 이진 문자열 간의 비교는 이진 문자열 비교로 으로 처리됩니다.

단순 비교 연산은 (> =,> =, <, < = 분류 및 그룹화) 각 캐릭터 기반으로 "정렬 값."동일한 정렬 값 문자 동일한 문자로 취급된다. 예를 들어, e와 ¹ 이 주어진 데이터 정렬에서 동일한 정렬 값을 갖는 경우, 이들은 동일한 것으로 비교됩니다.

는 대소 문자 어느 대소 ( _cs) 또는 이진 정렬 ( _bin)를 사용하여 강제. 악센트 구분을 강요하려면 언어 별 데이터 정렬 (경우 utf8mb4_polish_xxx) 또는 이진 데이터 정렬을 사용해야합니다. 일반 데이터 정렬은 악센트 문자와 비 악센트 문자를 구별하지 않습니다. 예를 들어 ą ć ę ń ś ź ż

, a < ą < b :

+0

어쩌면 직접 볼 수는 없지만 거기에 특별한 폴란드 문자 'ę'가 있습니다. – Jagger

+0

@ 재거 - 보이지만 그림자가 맞습니다. 당신이 사용하는 데이터 정렬은 폴란드어 악센트 부호가있는 문자와 라틴 문자 'e'에 동일한 가중치를 추가합니다. – Mjh

+0

그러나 @Mjh는 데이터 정렬이 악센트 부호가있는 문자를 동일하게 처리한다는 것을 분명히하기 위해 더 많은 설명을 추가했습니다. 대답의 첫 번째 문장은 대소 문자 구분에 지나치게 집중되었습니다. – Shadow

0

COLLATION utf8mb4_polish_ci는 "별도의 문자"이러한 처리합니다. 에서 대부분 다른 데이터 정렬은 a = ą < b입니다.

mysql> SET NAMES utf8mb4 COLLATE utf8mb4_polish_ci; 

mysql> SELECT 'SeP' = 'sęp'; 
+----------------+ 
| 'SeP' = 'sęp' | 
+----------------+ 
|    0 | 
+----------------+ 

다양한 데이터 정렬의 차이점에 대한 자세한 내용은 this을 참조하십시오.

+1

나는 뭔가를 놓쳤는가? 아니면 무언가를 잘못 해석할까요? 왜 downvote? –