MySQL에서 utf8mb4와 utf8 문자셋의 차이점은 무엇입니까?


341

MySQL 에서 utf8mb4utf8문자 집합 의 차이점은 무엇입니까 ?

ASCII , UTF-8 , UTF-16UTF-32 인코딩 에 대해 이미 알고 있습니다 . 그러나 MySQL Server에utf8mb4 정의 된 다른 인코딩 유형과 인코딩 그룹의 차이점이 무엇인지 궁금합니다 .

사용 utf8mb4보다는 특별한 이점 / 제안 이 utf8있습니까?

답변:


391

UTF-8 은 가변 길이 인코딩입니다. UTF-8의 경우 이는 하나의 코드 포인트를 저장하는 데 1-4 바이트가 필요함을 의미합니다. 그러나 "utf8"(별칭 "utf8mb3")이라는 MySQL의 인코딩은 코드 포인트 당 최대 3 바이트 만 저장합니다.

따라서 문자 세트 "utf8"/ "utf8mb3"는 모든 유니 코드 코드 포인트를 저장할 수 없습니다 : " 기본 다국어 평면 " 이라고하는 0x000에서 0xFFFF 범위 만 지원합니다 . 유니 코드 인코딩 비교를 참조하십시오 .

이것은 MySQL 문서 가 그것에 대해 말한 것 (같은 페이지의 이전 버전)입니다 .

이름이 utf8 [/ utf8mb3] 인 문자 세트는 문자 당 최대 3 바이트를 사용하며 BMP 문자 만 포함합니다. MySQL 5.5.3부터 utf8mb4 문자 세트는 문자 당 최대 4 바이트를 사용하여 보충 문자를 지원합니다.

  • BMP 문자의 경우 utf8 [/ utf8mb3] 및 utf8mb4는 동일한 저장 특성을 갖습니다. 동일한 코드 값, 동일한 인코딩, 동일한 길이.

  • 보충 문자의 경우 utf8 [/ utf8mb3]은 문자를 전혀 저장할 수 없지만 utf8mb4는 4 바이트를 저장해야합니다. utf8 [/ utf8mb3]는 문자를 전혀 저장할 수 없으므로 utf8 [/ utf8mb3] 열에 보충 문자가 없으며 이전 버전의 utf8 [/ utf8mb3] 데이터를 업그레이드 할 때 문자를 변환하거나 데이터를 잃을 염려가 없습니다. MySQL.

따라서 emoji 와 같이 BMP 외부에있는 문자 (및 일반적으로 원하는)를 열에서 지원 하도록하려면 "utf8mb4"를 사용하십시오. 실제 사용시 가장 일반적인 비 BMP 유니 코드 문자무엇입니까?를 참조하십시오 . .


10
utf8mb4가 '필수'인 유일한 사례는 지금까지 중국어와 이모티콘입니다. 그것을 필요로하는 모호한 알파벳이 있습니다.
Rick James

10
또한 데이터베이스에 암호화 된 비밀번호 및 데이터를 유지하는 데 사용하는 경우에도 필요합니다. 나는 정상적인 utf8 형식을 사용하여 mysql에서 암호화 된 암호를 유지하고 있었기 때문에 임의의 암호에 무작위로 많은 어려움을 겪고 디버깅하기가 매우 어려워서 base64 인코딩을 사용하여 일시적으로 문제를 해결했습니다. 그러나 지금 나는 그 이유를 알고 있습니다.
Mojtaba Rezaeian

38
@idealidea 암호화 된 데이터는 이진이므로 이진 데이터를 varchar 열에 저장하면 안됩니다. :)
CodeCaster

8
@thomasrutter UTF-8로 저장하려면이 문자를 사용해보십시오. :)
502_Geek

2
@ MojtabaRezaeian 그것은 암호 알고리즘에 다소 의존합니다-bcrypt2는 ASCII를 생성합니다.
Jasen

60

utf8mb4요즘 우리는 또한 언어 문자 만 문자, 새로 도입 된 그림 이모티콘 등뿐만 아니라 저장을위한 지원 필요하기 때문에 문자 세트에 유용합니다.

좋은이 읽을 MySQL 데이터베이스에서 전체 유니 코드 지원하는 방법 이 되거 수 마티아스 Bynens에 의해.


11
MySQL 8.0은 이제 기본적으로 utf8mb4 문자 세트로 설정됩니다. [ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk가

47

으로부터 촬영 매뉴얼의 MySQL 8.0 참조 :

  • utf8mb4: 문자 당 1-4 바이트를 사용 하는 유니 코드 문자 세트 의 UTF-8 인코딩 .

  • utf8mb3: 문자 당 1-3 바이트를 사용 하는 유니 코드 문자 세트 의 UTF-8 인코딩 .

에서 MySQL을 utf8 현재의 별칭입니다 utf8mb3있는 사용되지 와 미래에서 제거됩니다 MySQL의 릴리스. 이 시점 utf8 에서에 대한 참조가됩니다 utf8mb4 .

따라서이 별칭에 관계없이 의식적으로 utf8mb4인코딩을 설정할 수 있습니다 .

답을 완성하기 위해 아래 @WilliamEntriken의 의견 을 추가하고 싶습니다 (설명서에서 가져 왔습니다).

의 의미에 대한 모호성을 피하려면 대신 문자 세트 참조 utf8utf8mb4명시 적으로 지정하십시오 utf8.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.