MySQL: 잘못된 문자열 값

MySQL: 잘못된 문자열 값

UTF8 형식의 웹페이지에서 특정 문자에 문제가 자주 발생합니다.

저는 MySQL 5.7과 Debian 9를 실행하고 있습니다. 내 데이터베이스가 utf8문자 집합을 사용하고 있습니다.

오늘 MySQL 쿼리를 디버깅하는 동안 SHOW WARNINGS;메시지 필드를 실행하여 확인했습니다.

 Incorrect string value: '\xF0\x9D\x8C\x86' for column `xxxx`;

뭐가 문제 야?

답변1

결국 오류를 검색해 보니 utf8MySQL의 문자 집합에 버그가 있거나 뇌가 손상되어 사용해서는 안 된다는 내용의 기사가 여러 개 발견되었습니다.

대체할 때는 utf8mb4문자 집합을 대신 사용해야 합니다.

~에서MySQL에서는 절대로 "utf8"을 사용하지 마십시오. "utf8mb4"를 사용하세요

MySQL의 "utf8"은 UTF-8이 아닙니다.

"utf8" 인코딩은 문자당 3바이트만 지원합니다. 진정한 UTF-8 인코딩(사용자를 포함하여 모든 사람이 사용하는 인코딩)에는 문자당 최대 4바이트가 필요합니다.

MySQL 개발자는 이 버그를 수정한 적이 없습니다. 그들은 2010년에 "utf8mb4"라는 새로운 문자 세트라는 해결 방법을 발표했습니다.

간단히 말해서:
- MySQL의 "utf8mb4"는 "UTF-8"을 의미합니다.
- MySQL의 "utf8"은 "전용 문자 인코딩"을 의미합니다. 이 인코딩은 많은 유니코드 문자를 인코딩할 수 없습니다.

여기서 일반적인 설명을 하려고 합니다. 현재 "utf8"을 사용하는 모든 MySQL 및 MariaDB 사용자는 실제로 "utf8mb4"를 사용해야 합니다. 누구도 "utf8"을 사용해서는 안 됩니다.

~에서MySQL 데이터베이스에서 전체 유니코드를 지원하는 방법

결과적으로 MySQL의 utf8 문자 세트는 올바른 UTF-8 인코딩을 부분적으로만 구현합니다. 1~3바이트로 구성된 UTF-8 인코딩 기호만 저장할 수 있으며, 4바이트를 차지하는 인코딩 기호는 지원되지 않습니다.

위에 표시된 것처럼 이 동작은 데이터 손실로 이어질 수 있지만 더 심해지면 보안 침해로 이어질 수 있습니다. 다음은 이 기사가 게시된 이후 발견된 몇 가지 예입니다.

  • 특정 WordPress 플러그인과 함께 원격 코드 실행으로 이어지는 WordPress < 3.6.1의 PHP 개체 주입 취약점
  • Phabricator의 이메일 인증은 WordPress 4.1.2에 저장된 XSS를 우회합니다.
  • Joomla!의 원격 명령 실행 콘텐츠 관리 시스템!

TL;DR MySQL의 utf8인코딩 이름 지정은 올바른 UTF-8 인코딩과 다르기 때문에 어색합니다. 완전한 유니코드 지원을 제공하지 않으므로 데이터 손실이나 보안 취약점이 발생할 수 있습니다.

관련 정보