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


341

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

ASCII , UTF-8 , UTF-16 및 UTF-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의 의견 을 추가하고 싶습니다 (설명서에서 가져 왔습니다).

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

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