답변:
MySQL 문서에서 :
문자 집합 기호와 인코딩의 집합입니다. 정렬은 문자 집합의 문자를 비교하기위한 규칙의 집합입니다. 가상의 문자 집합의 예를 통해 구별을 명확하게 만들어 봅시다.
'A', 'B', 'a', 'b'의 네 글자로 된 알파벳이 있다고 가정합니다. 각 문자에 숫자를 부여합니다 : 'A'= 0, 'B'= 1, 'a'= 2, 'b'= 3. 문자 'A'는 기호이고 숫자 0은 'A'에 대한 인코딩 네 글자와 인코딩의 조합은 문자 세트입니다.
이제 두 문자열 값 'A'와 'B'를 비교한다고 가정하겠습니다. 가장 간단한 방법은 인코딩을 살펴 보는 것입니다 : 0은 'A', 1은 'B'. 0은 1보다 작으므로 'A'는 'B'보다 작습니다. 이제 방금 수행 한 작업은 문자 집합에 데이터 정렬을 적용하는 것입니다. 데이터 정렬은 일련의 규칙입니다 (이 경우 하나의 규칙 만) : "인코딩 비교". 우리는 가능한 모든 데이터 정렬 중 가장 간단한 데이터를 이진 데이터 정렬이라고 부릅니다.
그러나 소문자와 대문자가 같다고 말하고 싶다면 어떻게해야합니까? 그런 다음 최소한 두 가지 규칙이 있습니다. (1) 소문자 'a'및 'b'를 'A'및 'B'와 동등한 것으로 취급합니다. (2) 그런 다음 인코딩을 비교하십시오. 이를 대소 문자를 구분하지 않는 데이터 정렬이라고합니다. 이진 데이터 정렬보다 조금 더 복잡합니다.
실제로 대부분의 문자 세트에는 'A'와 'B'뿐만 아니라 전체 알파벳, 때로는 수천 개의 문자가 포함 된 여러 알파벳 또는 동부 쓰기 시스템과 많은 특수 기호 및 문장 부호가 있습니다. 또한 실제로는 대부분의 데이터 정렬에 대 / 소문자 구분이 아닌 악센트 구분 ( "액센트"가 독일어 'ö'와 같이 문자에 첨부 된 표식)과 여러 문자 매핑 (예 : ' ö '= 두 독일 조합 중 하나에서'OE ').
문자 인코딩은 그들이 메모리에 맞지 그래서 인코딩 문자로 방법입니다. 즉, 문자 집합이 ISO-8859-15이면 유로 기호 €는 0xa4로 인코딩되고 UTF-8에서는 0xe282ac가됩니다.
정렬이 latin9에 같은 문자가있는 문자를 비교하는 방법입니다 e é è ê f
자신의 바이너리 표현으로 분류하면, 그것은 갈 것입니다 e f é ê è
정렬로 설정되어있는 경우, 예를 들어,하지만, 프랑스어, 당신은 당신이 생각 순서대로해야합니다 그들은 는 모두 e é è ê
같고, 그런 다음 f
입니다.
문자 집합은 작성된 모든 글리프의 하위 집합입니다. 문자 인코딩은 해당 문자가 숫자 값에 매핑되는 방법을 지정합니다. UTF-8 및 UTF-16과 같은 일부 문자 인코딩은 범용 문자 세트의 모든 문자를 인코딩 할 수 있습니다. US-ASCII 또는 ISO-8859-1과 같은 다른 문자는 각각 문자 당 7 비트와 8 비트를 사용하므로 작은 하위 세트 만 인코딩 할 수 있습니다. 많은 표준이 문자 세트와 문자 인코딩을 모두 지정하기 때문에 "문자 세트"라는 용어는 종종 "문자 인코딩"을 자유롭게 대체합니다.
데이터 정렬은 문자를 정렬하기 위해 비교하는 방법을 지정하는 규칙으로 구성됩니다. 데이터 정렬 규칙은 로케일마다 다를 수 있습니다. 두 문자의 올바른 순서는 언어마다 다릅니다.
문자 집합과 데이터 정렬을 선택하면 응용 프로그램의 국제화 여부가 결정됩니다. 그렇지 않은 경우 어떤 지역을 타겟팅하고 있습니까?
지원하려는 문자 세트를 선택하려면 응용 프로그램을 고려해야합니다. 사용자 제공 입력을 저장하는 경우 소프트웨어가 결국 사용될 모든 로케일을 예측하기 어려울 수 있습니다. 이들을 모두 지원하려면 처음부터 UCS (유니 코드)를 지원하는 것이 가장 좋습니다. 그러나 이에 대한 비용이 있습니다. 많은 서유럽 문자는 이제 문자 당 1 바이트 대신 2 바이트의 저장 공간이 필요합니다.
데이터베이스에서 데이터 정렬을 사용하여 인덱스를 만든 다음 나중에 해당 인덱스를 사용하여 정렬 된 결과를 제공하는 경우 올바른 데이터 정렬을 선택하면 성능에 도움이 될 수 있습니다. 그러나 데이터 정렬 규칙은 대개 로캘별로 다르므로 다른 로캘의 규칙에 따라 결과를 정렬해야하는 경우 해당 인덱스는 가치가 없습니다.
utf8mb4_unicode_ci
정렬 및 비교에 대한 유니 코드 표준을 기반으로하는 매우 다양한 언어로 정확하게 정렬되는 을 사용 하는 것이 좋습니다 .
UTF-8
데이터베이스 외부의 시스템에서 인코딩 을 사용 하는 경우 다른 위치에서 사용하는 인코딩에 따라 달라집니다 . MySQLutf8mb4
에서 사용하는 경우 데이터베이스의 모든 항목도 올바르게 작성해야합니다 . MySQL 에서 특정 문자에 대한 텍스트를 정렬, 비교 및 변환하는 올바른 작동에 관해서 는 완벽한 솔루션을 찾기가 어렵지만 확실히 낫지 만 단점도 있습니다. 읽어 보시기 바랍니다 : dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html*_unicode_ci
*_general