UTF-8 : 일반? 큰 상자? 유니 코드?


279

다양한 유형의 데이터에 어떤 데이터 정렬을 사용 해야하는지 파악하려고합니다. 내가 저장할 콘텐츠의 100 %가 사용자가 제출했습니다.

내 이해는 UTF-8 이진 대신 UTF-8 일반 CI (대소 문자 구분)를 사용해야한다는 것입니다. 그러나 UTF-8 General CI와 UTF-8 Unicode CI의 명확한 차이점을 찾을 수 없습니다.

  1. 사용자가 제출 한 컨텐츠를 UTF-8 General 또는 UTF-8 Unicode CI 열에 저장해야합니까?
  2. UTF-8 바이너리는 어떤 유형의 데이터에 적용됩니까?

16
참고 사항이지만 대신 UTF-8을 완전히 지원 utf8하려면 utf8mb4대신 사용하십시오 . 이 인기있는 질문에 대한 답변이 이것을 다루지 않기 때문에 여기에 주석을 답니다. mathiasbynens.be/notes/mysql-utf8mb4
Steven R. Loomis

대소 문자를 구분하지만 악센트를 구분 하려면 bugs.mysql.com 으로 요청 하십시오 .
Rick James

또는 bugs.mysql.com/bug.php?id=58797에서 "나에게 영향"을 클릭 하고 설명을 추가하십시오.
Rick James

답변:


299

일반적으로 utf8_general_ciutf8_unicode_ci 보다 빠르지 만 덜 정확합니다.

차이점은 다음과 같습니다.

유니 코드 문자 집합의 경우 _general_ci 데이터 정렬을 사용하여 수행 된 작업은 _unicode_ci 데이터 정렬보다 빠릅니다. . 예를 들어, utf8_general_ci 데이터 정렬에 대한 비교는 utf8_unicode_ci에 대한 비교보다 빠르지 만 약간 덜 정확합니다. 그 이유는 utf8_unicode_ci가 확장과 같은 맵핑을 지원하기 때문입니다. 즉, 한 문자가 다른 문자의 조합과 같을 때. 예를 들어 독일어 및 일부 다른 언어에서 "ß"는 "ss"와 같습니다. utf8_unicode_ci는 수축 및 무시할 수있는 문자도 지원합니다. utf8_general_ci는 확장, 축소 또는 무시할 수없는 문자를 지원하지 않는 레거시 데이터 정렬입니다. 문자를 일대일로 비교할 수 있습니다.

인용 : http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

자세한 설명은 MySQL 포럼에서 다음 게시물을 읽으십시오. http://forums.mysql.com/read.php?103,187048,188748

utf8_bin의 경우 : utf8_general_ciutf8_unicode_ci 는 대소 문자를 구분하지 않는 비교를 수행합니다. 반대로, utf8_bin은 문자 의 이진 값을 비교하기 때문에 대소 문자를 구분합니다 (다른 차이점 중에서도).


2
_unicode_ci를 사용해야 할 이유가 없다면 _general_ci를 사용하십시오.
Sagi

4
이것은 실제로 질문에 깊이 답하지 않습니다. 이 데이터 정렬의 차이점은 정확히 무엇입니까?
Pekka

4
간단하게하기 위해 정확한 차이점은 여기에 제공되지 않습니다. 정확한 차이 가있는 게시물에 대한 링크를 추가했습니다 .
Sagi

NB를 show collation;사용하면 각 문자 세트에 대한 기본 데이터 정렬을 볼 수 있습니다. 5.1은의 utf8_general_ci기본값으로 표시 됩니다 utf8.
David Carboni

9
두 데이터 정렬 사이의 실제 속도 차이에 더 깊이 들어가는 리소스가 있습니까? 0.1 %의 성능 저하 또는 10 %의 감소에 대해 이야기하고 있습니까?
Emphram Stavanger

90

varchar 필드를 고유 또는 기본 인덱스로 'a'및 'á'와 같은 2 개의 값을 삽입 할 때 utf8_general_ci를 사용하면 중복 키 오류가 발생한다는 사실도 알고 있어야합니다.


3
감사합니다. 이것은 유사한 사용자 이름을 피하는 데 유용합니다 (예 : "jose"가있는 경우 다른 사람이 "josé"사용자를 작성하지 않기를 원합니다) NB : 이것은 대부분의 utf8 데이터 정렬 (utf8_bin 제외)에도 적용됩니다. 가장 확실한 / 가장 안전한 / 가장 포괄적 인utf8_unicode_ci
Costa Costa

2
utf8_bin을 사용하여 색인에서 jose와 josé를 구별하고 싶습니다. 예를 들어 사용자가 josé를 검색하여 jose로 대체하기로 결정한 검색 / 바꾸기 조작을 기록하는 열입니다. (나는 스프레드 시트 프로그램을 작성하고있다)
Buttle Butkus

33
  • utf8_bin비트를 맹목적으로 비교합니다. 케이스 접기, 악센트 제거 없음.
  • utf8_general_ci1 바이트와 1 바이트를 비교합니다. 접는 경우 악센트 제거는 수행하지만 두 문자 비교 ij는 없습니다 : ij이 데이터 정렬에서 동일하지 않습니다 .
  • utf8_*_ci언어 별 규칙 세트이지만 그렇지 않은 경우와 같습니다 unicode_ci. 일부 특별한 경우 : Ç, Č, ch,ll
  • utf8_unicode_ci비교를 위해 이전 유니 코드 표준을 따릅니다. ij= ij, 그러나 ae! =æ
  • utf8_unicode_520_ci최신 유니 코드 표준을 따릅니다. ae=æ

다양한 utf8 데이터 정렬과 동일한 기능에 대한 자세한 내용 은 데이터 정렬 차트 를 참조하십시오 .

utf8, MySQL이 정의 1- 3 바이트 UTF8 코드로 한정된다. 이모 지와 일부 중국어는 제외됩니다. utf8mb4유럽을 훨씬 넘어서고 싶다면 실제로 전환해야합니다 .

위의 사항은 utf8mb4적절한 철자 변경 후에 적용됩니다 . 앞으로 utf8mb4utf8mb4_unicode_520_ci선호된다.

  • utf16 및 utf32는 utf8의 변형입니다. 사실상 그것들을 사용하지 않습니다.
  • ucs2는 "utf8"보다 "Unicode"에 더 가깝습니다. 사실상 사용하지 않습니다.

1
"조정 상태 유지": 8.0 데이터 정렬 은 8.0 utf8mb4 데이터 정렬에서 다양한 문자, 디프 톤 등이 어떻게 비교되는지 보여줍니다. utf8은 대부분 동일합니다.
Rick James

8.0 데이터 정렬은 5.x보다 훨씬 빠릅니다.
Rick James

해당 페이지가 맨 위에 utf8mb4_bin을 나열하면 좋을 것입니다. 나는 그것이 문자 매칭이 전혀 없다는 것을 알고 있지만 초보자에게는 좋습니다.
Henk Poley

6

실제로 고유 인덱스가 있는 열에 'é'및 'e'와 같은 값을 저장하는 것을 테스트 했으며 'utf8_unicode_ci'와 'utf8_general_ci'에 중복 오류가 발생했습니다. 'utf8_bin'조합 열에 만 저장할 수 있습니다.

그리고 mysql 문서 ( http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html )는 예제 세트 'utf8_general_ci'조합을 제안합니다.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

1
나는 이것에 대한 빠른 테스트를했는데 정확한 것으로 보입니다. 열의 고유 키와 물결표 등의 값에 대해서는 두 데이터 정렬이 동일하게 동작합니다.
MirroredFate

@MirroredFate OK, 열에이 오류를 일으키는 고유 인덱스가 있어야한다는 것을 추가해야합니다. 내 대답에 내포되어 있습니다.
vitalii

3

허용되는 답변이 오래되었습니다.

MySQL 5.5.3 이상을 사용 utf8mb4_unicode_ci하는 경우 대신 utf8_unicode_ci사용자가 입력 한 문자가 오류를 발생시키지 않도록 대신 사용 하십시오.

utf8mb4예를 들어 이모티콘을 지원하지만 utf8다음과 같은 수백 가지 인코딩 관련 버그가 발생할 수 있습니다.

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1


이 답변은 Emoji (및 일부 중국어) 인코딩 문제를 해결합니다. 그러나 질문은 데이터 정렬에 중점을 둔 것으로 보입니다. utf8mb4_unicode_ci모든 이모티콘을 동일하게 취급합니다. utf8mb4_unicode_520_ci이모티콘에 주문을 제공합니다.
Rick James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.