![MySQL: 잘못된 문자열 값](https://linux55.com/image/128737/MySQL%3A%20%EC%9E%98%EB%AA%BB%EB%90%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EA%B0%92.png)
UTF8 형식의 웹페이지에서 특정 문자에 문제가 자주 발생합니다.
저는 MySQL 5.7과 Debian 9를 실행하고 있습니다. 내 데이터베이스가 utf8
문자 집합을 사용하고 있습니다.
오늘 MySQL 쿼리를 디버깅하는 동안 SHOW WARNINGS;
메시지 필드를 실행하여 확인했습니다.
Incorrect string value: '\xF0\x9D\x8C\x86' for column `xxxx`;
뭐가 문제 야?
답변1
결국 오류를 검색해 보니 utf8
MySQL의 문자 집합에 버그가 있거나 뇌가 손상되어 사용해서는 안 된다는 내용의 기사가 여러 개 발견되었습니다.
대체할 때는 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 인코딩과 다르기 때문에 어색합니다. 완전한 유니코드 지원을 제공하지 않으므로 데이터 손실이나 보안 취약점이 발생할 수 있습니다.