What's the difference between utf8_general_ci and utf8_unicode_ci?
Between utf8_general_ci and utf8_unicode_ci, are there any differences in terms of performance?
stackoverflow.com
#_unicode_ci VS #_general_ci
우리가 기대하는 방식에 따라 텍스트를 정렬하고 비교하기 위한 두 가지 다른 규칙 집합입니다.
_unicode_520_ci 최신 버전의 MySQL은 유니코드 5.2를 기반으로 하는 동등한 규칙 또는 유니코드 9.0을 기반으로 하는 동등한 규칙에 특화된 MySQL 8.x와 같은 새로운 규칙 세트도 도입합니다. _0900_ai_ci(동등한 변형 없음 _general_ci). 지금 이 글을 읽는 사람들은 아마도 _unicode_ci 또는 _general_ci. 아래의 이전 데이터 정렬에 대한 설명은 관심용으로만 제공됩니다.
MySQL은 현재 이전의 결함 있는 UTF-8 구현에서 벗어나 전환하고 있습니다. 지금은 고정된 버전을 받고 있는지 확인하기 위해 문자 인코딩 부분 utf8mb4 대신 사용해야 합니다 . utf8 결함이 있는 버전은 더 이상 사용되지 않지만 이전 버전과의 호환성을 위해 남아 있습니다.
주요 차이점
- utf8mb4_unicode_ci 광범위한 언어에서 정확하게 정렬하는 범용 정렬 및 비교를 위한 공식 유니코드 규칙을 기반으로 합니다.
- utf8mb4_general_ci 속도를 향상시키기 위해 설계된 많은 지름길을 사용하면서 가능한 한 잘하는 것을 목표로 하는 단순화된 정렬 규칙 세트입니다. 유니코드 규칙을 따르지 않으며 특정 언어나 문자를 사용하는 경우와 같은 일부 상황에서 바람직하지 않은 정렬이나 비교가 발생합니다.
- 최신 서버에서 이러한 성능 향상은 거의 무시할 수 있습니다. 서버가 오늘날 컴퓨터의 CPU 성능의 아주 작은 부분을 차지하던 시기에 고안되었습니다.
utf8mb4_unicode_ci 이상의 이점 utf8mb4_general_ci
utf8mb4_unicode_ci 정렬 및 비교에 유니코드 규칙을 사용하는 은 광범위한 언어에서 그리고 광범위한 특수 문자를 사용할 때 올바른 정렬을 위해 상당히 복잡한 알고리즘을 사용합니다. 이러한 규칙은 언어별 규칙을 고려해야 합니다. 모든 사람이 '알파벳순'이라고 부르는 방식으로 문자를 정렬하지는 않습니다.
라틴어(예: "유럽") 언어에 관한 한 Unicode 정렬과 MySQL의 단순화된 정렬 사이에는 큰 차이가 없지만 utf8mb4_general_ci 여전히 몇 가지 차이점이 있습니다.
- 예를 들어, 유니코드 데이터 정렬은 "ss"와 같은 "ß" 및 "OE"와 같은 "Œ"를 해당 문자를 사용하는 사람들이 일반적으로 원하는 대로 정렬하는 반면 단일 utf8mb4_general_ci 문자(각각 "s" 및 "e"와 유사함)로 정렬합니다. .
- 일부 유니코드 문자는 무시할 수 있는 것으로 정의됩니다. 즉, 정렬 순서에 포함되지 않아야 하며 대신 비교가 다음 문자로 이동해야 합니다. utf8mb4_unicode_ci 이것들을 적절하게 처리합니다.
아시아 언어나 알파벳이 다른 언어와 같은 비라틴어에서는 유니코드 정렬과 단순화된 정렬 사이에 훨씬 더 많은 utf8mb4_general_ci 차이가 있을 수 있습니다 .
적합성은 utf8mb4_general_ci 사용되는 언어에 크게 좌우됩니다. 일부 언어의 경우 상당히 부적절합니다.
무엇을 사용해야 합니까?
utf8mb4_general_ci 성능 차이가 중요할 정도로 CPU 속도가 낮은 지점을 남겨두었기 때문에 더 이상 사용할 이유가 거의 없습니다.
과거에는 utf8mb4_general_ci성능 비용을 정당화할 만큼 정확한 정렬이 중요할 때를 제외하고 일부 사람들이 사용을 권장했습니다. 오늘날 이러한 성능 비용은 거의 사라졌으며 개발자는 국제화를 더욱 심각하게 다루고 있습니다.
정확도보다 속도가 더 중요하다면 정렬을 전혀 수행하지 않는 것이 나을 수도 있다는 주장이 있습니다. 정확할 필요가 없다면 알고리즘을 더 빠르게 만드는 것은 사소한 일입니다. 따라서 utf8mb4_general_ci 속도상의 이유로 필요하지 않고 정확성상의 이유로도 적합하지 않은 절충안입니다.
내가 추가할 또 다른 사항은 응용 프로그램이 영어만 지원한다는 것을 알고 있더라도 사람들의 이름을 처리해야 할 수 있다는 것입니다. 이 이름에는 종종 올바르게 정렬하는 것이 중요한 다른 언어에서 사용되는 문자가 포함될 수 있습니다. . 모든 것에 유니코드 규칙을 사용하면 매우 똑똑한 유니코드 사람들이 정렬 작업을 제대로 수행하기 위해 열심히 노력했다는 사실에 안심할 수 있습니다.
What the parts mean
첫째, 대소문자를 구분하지 않는ci 정렬 및 비교를 위한 것입니다 .
즉, 텍스트 데이터에 적합하며 대소문자는 중요하지 않습니다. 다른 유형의 데이터 정렬은 대소문자가 중요한 텍스트 데이터의 경우 (대소문자 구분)이고 , 인코딩이 일치해야 하는 경우 비트 단위로 실제로 인코딩된 이진 데이터(예: Base64). 대소문자 구분 정렬은 이상한 결과를 낳고 대소문자 구분 비교는 대소문자만 다른 중복 값을 초래할 수 있으므로 대소문자 구분 데이터 정렬은 텍스트 데이터에 적합하지 않습니다. 대소문자가 중요한 경우 구두점을 무시할 수 있습니다. 등도 중요할 수 있으며 이진 데이터 정렬이 더 적절할 수 있습니다.csbin
다음으로 unicode또는 general특정 정렬 및 비교 규칙, 특히 텍스트가 정규화되거나 비교되는 방식을 나타냅니다. utf8mb4 문자 인코딩에는 다양한 규칙 세트가 있으며, 하나의 특정 언어가 아닌 모든 가능한 언어에서 잘 작동하도록 시도하는 두 가지 규칙이 있습니다 unicode. general이 두 가지 규칙 집합의 차이점이 이 답변의 주제입니다. unicode유니코드 4.0의 규칙을 사용합니다 . 최신 버전의 MySQL 및 MariaDB는 unicode_520유니코드 5.2의 규칙을 사용하여 규칙 세트를 추가하고 MySQL 8.x는 0900유니코드 9.0의 규칙을 사용하여 추가합니다("unicode_" 부분 삭제).
마지막으로 utf8mb4내부적으로 사용되는 문자 인코딩입니다. 이 답변에서는 유니코드 기반 인코딩에 대해서만 이야기하고 있습니다.
### Reply
'Database' 카테고리의 다른 글
[SQL] Count 함수, Sequel vs SQL (0) | 2023.08.19 |
---|---|
Apache Parquet(파케이) (0) | 2023.08.14 |
[Mysql] python executemany 사용시 TypeError: not all arguments converted during string ... (0) | 2022.03.23 |
[Mysql] Python Sql query Format Error (0) | 2022.03.21 |
[Mysql] Pymysql INSERT 쿼리 생성기 (0) | 2022.03.21 |