MySQL을 사용하는 웹사이트 중에 DB 문자세트가 'utf8'로 지정된 경우, 유니코드 확장B 이상의 한자는 입력이 안되는 문제가 있소. 입력만 안되는 것이 아니라, 해당 문자 이후의 내용이 아예 사라져버리는 심각한 문제라오.

(티스토리도 확장B 한자를 지원하지 않는지, 애써 작성한 포스트를 날려먹은 바 있소.)


DB 문자세트(데이터정렬방식)를 위 그림과 같이 'utf8mb4'로 지정해야만 유니코드의 모든(1~4바이트) 문자를 쓸 수 있다고 하니, 혹시 확장한자 입력 문제를 겪는 햏자들은 DB의 문자세트 설정을 확인해보기 바라오(일부 구버전에서는 지원하지 않음).


아울러, PHP 파일 등에 mysql_query("set names utf8"); 이런 대목이 있는 경우도 이를 mysql_query("set names utf8mb4"); 이렇게 같이 바꾸어 주어야 하오.






  1. 은령 2014.03.12 11:11 신고

    실은 utf8이라 함은 제대로 된 유니코드가 아니라 이전의 영어 코드와 호환하고 싶어 덧붙이기처럼 유니코드를 조합시킨 것에 가깝소이다.
    '그냥' 유니코드는 utf16 등으로 말하는 16비트일진대 MySQL의 설정이 utf8의 호환에 맞춰져 있는 듯하오.

    • - 관리자 - 2014.03.12 12:20 신고

      오호 그렇구료~
      요즘 웹사이트에서는 대부분 utf-8을 쓰고 있지만, 아직도 심지어 고리짝 euc-kr을 쓰는 페이지도 많아 소햏처럼 한자로 먹고 사는 햏자들에게는 애로사항이오.

    • 나모찾기 2015.10.14 23:12 신고

      utf8 제대로된 유니코드가 맞고, 그냥 유니코드라는 것은 없소. 유니코드가 16비트라는 것도 틀리오.

  2. 과기 2015.05.20 19:32 신고

    utf8도 '제대로 된 유니코드'를 표현하는 방법 중 하나입니다만, MySQL에서 'utf8'은 'utf8mb3'의 alias, 즉 UTF-8을 3바이트까지만 처리하는 인코딩입니다.
    말씀하신 확장B 한자 영역은 U+20000 부터이므로, 이 코드포인트를 UTF-8로 표현하려면 4바이트가 필요합니다. 그런데... utf8mb3을 쓰면 처리를 못하는게 아니라(3바이트로 짤려서 잘못된 글자가 되는 것이 아니라) 아예 처리를 안 하기 때문에 글자가 아예 사라집니다.
    해결책은 적으신대로 utf8mb4 를 사용하는 것이구요...
    참고로 이 경우는 UTF-16으로도 4바이트 필요합니다. (16비트를 surrogate pair로 2개 사용)

    저도 이런 문제가 있어서 찾아보다가 글 남기고 가는데요, 요지는 UTF-8이나 UTF-16이나 똑같이 '그냥' 유니코드 인코딩 중 하나라는 거죠 ^^;
    (사족을 덧붙이면, UTF-16이나 UTF-32는 바이트 순서 문제가 있고 UTF-16은 코드 순으로 정렬할 때 16비트를 넘어가는 코드포인트, 즉 U+10000 이후 글자들이 surrogate pair를 사용하기 때문에 다른 인코딩과 정렬 순서가 달라지는 문제가 있습니다. 그래서 웹에서는 UTF-8을 주로 사용하는게 아닐까 하네요.)

+ Recent posts