문자 집합과 데이터 정렬은 정확히 무엇을 의미합니까?


315

MySQL 문서를 읽을 수 있으며 꽤 분명합니다. 그러나 사용할 문자 세트를 어떻게 결정합니까? 데이터 정렬은 어떤 데이터에 영향을 미칩니 까?

두 가지에 대한 설명과 선택 방법을 묻습니다.

답변:


511

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 ').


206

문자 인코딩은 그들이 메모리에 맞지 그래서 인코딩 문자로 방법입니다. 즉, 문자 집합이 ISO-8859-15이면 유로 기호 €는 0xa4로 인코딩되고 UTF-8에서는 0xe282ac가됩니다.

정렬이 latin9에 같은 문자가있는 문자를 비교하는 방법입니다 e é è ê f자신의 바이너리 표현으로 분류하면, 그것은 갈 것입니다 e f é ê è정렬로 설정되어있는 경우, 예를 들어,하지만, 프랑스어, 당신은 당신이 생각 순서대로해야합니다 그들은 는 모두 e é è ê같고, 그런 다음 f입니다.


5
단일 문자 집합에 대해 여러 가지 다른 데이터 정렬이있을 수 있습니다. "올바른"것은 일반적으로 쓰여진 언어에 의해 결정되는 텍스트의 의미에 따라 달라집니다.
Phil

20

문자 집합은 작성된 모든 글리프의 하위 집합입니다. 문자 인코딩은 해당 문자가 숫자 값에 매핑되는 방법을 지정합니다. UTF-8 및 UTF-16과 같은 일부 문자 인코딩은 범용 문자 세트의 모든 문자를 인코딩 할 수 있습니다. US-ASCII 또는 ISO-8859-1과 같은 다른 문자는 각각 문자 당 7 비트와 8 비트를 사용하므로 작은 하위 세트 만 인코딩 할 수 있습니다. 많은 표준이 문자 세트와 문자 인코딩을 모두 지정하기 때문에 "문자 세트"라는 용어는 종종 "문자 인코딩"을 자유롭게 대체합니다.

데이터 정렬은 문자를 정렬하기 위해 비교하는 방법을 지정하는 규칙으로 구성됩니다. 데이터 정렬 규칙은 로케일마다 다를 수 있습니다. 두 문자의 올바른 순서는 언어마다 다릅니다.

문자 집합과 데이터 정렬을 선택하면 응용 프로그램의 국제화 여부가 결정됩니다. 그렇지 않은 경우 어떤 지역을 타겟팅하고 있습니까?

지원하려는 문자 세트를 선택하려면 응용 프로그램을 고려해야합니다. 사용자 제공 입력을 저장하는 경우 소프트웨어가 결국 사용될 모든 로케일을 예측하기 어려울 수 있습니다. 이들을 모두 지원하려면 처음부터 UCS (유니 코드)를 지원하는 것이 가장 좋습니다. 그러나 이에 대한 비용이 있습니다. 많은 서유럽 문자는 이제 문자 당 1 바이트 대신 2 바이트의 저장 공간이 필요합니다.

데이터베이스에서 데이터 정렬을 사용하여 인덱스를 만든 다음 나중에 해당 인덱스를 사용하여 정렬 된 결과를 제공하는 경우 올바른 데이터 정렬을 선택하면 성능에 도움이 될 수 있습니다. 그러나 데이터 정렬 규칙은 대개 로캘별로 다르므로 다른 로캘의 규칙에 따라 결과를 정렬해야하는 경우 해당 인덱스는 가치가 없습니다.


미안하지만 난 그냥 초보자이고 당신의 설명이 필요합니다. 따라서 이와 같이 데이터 정렬을 이해할 수 있습니까? 각 문자 (라틴어 또는 중국어)가 올바르게 인식되고 각 인코딩이 제공되도록하는 것입니다. 그 맞습니까? 답장을
부탁

1
@Mirich 아니요, 데이터 정렬은 문자를 정렬하는 방법에 대한 정보입니다. 세계의 다른 지역에서는 문자를 다른 방식으로 정렬하는 것을 선호합니다.
erickson

3

utf8mb4_unicode_ci정렬 및 비교에 대한 유니 코드 표준을 기반으로하는 매우 다양한 언어로 정확하게 정렬되는 을 사용 하는 것이 좋습니다 .


3
OP에서 : "두 가지에 대한 설명과 선택 방법을 요구하고 있습니다"
Dan Esparza

1
@simhumileco, 죄송합니다. 나는 초보자에 불과하며 설명이 필요합니다. 따라서 이와 같이 데이터 정렬을 이해할 수 있습니까? 각 문자 (라틴어 또는 중국어)가 올바르게 인식되고 각 인코딩이 제공되도록하는 것입니다. 그 맞습니까? 답장을
부탁

1
@Mirich UTF-8데이터베이스 외부의 시스템에서 인코딩 을 사용 하는 경우 다른 위치에서 사용하는 인코딩에 따라 달라집니다 . MySQLutf8mb4 에서 사용하는 경우 데이터베이스의 모든 항목도 올바르게 작성해야합니다 . MySQL 에서 특정 문자에 대한 텍스트를 정렬, 비교 및 ​​변환하는 올바른 작동에 관해서 는 완벽한 솔루션을 찾기가 어렵지만 확실히 낫지 만 단점도 있습니다. 읽어 보시기 바랍니다 : dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html*_unicode_ci*_general
simhumileco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.