질문/조언질답게시판

현재 utf8mb4_unicode_ci 정렬방식에 innoDB를 엔진으로 사용하고 있습니다.

현재 모든 테이블의 데이터들도 utf8mb4_unicode_ci로 반영되어 있고 class의 db도 utf8에서 utf8mb4로 수정한 상황입니다.

이모지 사용과 MySQL의 utf8 자료 저장 방식이 구형이라는 이야기를 듣고 테이블 또한 변경한 것인데 오류가 발생하고 있어 돌리려고 합니다.

이모지가 손실되는 것은 상관 없는데 혹시 다른 것들도 손실이 될 수 있는 것인지요?

그리고 서버 스펙은 innoDB를 사용할 정도의 스펙이 아닌데 사용하고 있어서 myisam으로 돌아가려고 하는데 문제가 생길 수 있을 까요?

추가적으로 utf8mb4_unicode_ci에서 utf8_general_ci로 변경하니까 자료형이 맞지 않는다고 하는데 int형이나 char형은 utf8이나 utf8mb4나 다름 없고 text 자료형만 다른 것이 아닌지요?

 

 

  • profile

    어떤 오류가 발생하나요? InnoDB로 변환한 후 오류가 날 경우 db.config.php에서 use_prepared_statements를 N으로 변경하면 해결될 때도 있습니다. 쿼리를 엉터리로 짜놓은 서드파티 자료들이 종종 이 부분에 걸립니다. 반면, utf8mb4 자체가 문제를 일으키는 경우는 대부분 인덱스 길이 때문으로, varchar(255) 필드를 varchar(191)로 줄여 주면 해결됩니다.

    utf8mb4에서 utf8로 되돌린다고 이모지 외에 딱히 손실될 만한 것은 없지만, 디비를 직접 건드리는 데는 항상 위험부담이 따르니 미리 백업해 놓고 테이블 한두 개만 먼저 변환해 보시기 바랍니다. 참고로 charset과 collate는 항상 함께 바꾸어야 합니다. charset이 utf8mb4라면 collate도 utf8mb4_unicode_ci로 하셔야 하고, collate를 utf8_general_ci로 되돌린다면 charset도 마찬가지로 utf8이 되어야 합니다.

    이모지 사용이 필요하신 거라면 documents, comments 테이블의 title, content 필드만 utf8mb4로 바꾸고 나머지는 모두 utf8로 놔두셔도 무방합니다. 아니면 공홈 자료실에 있는 MySQL UTF-8 이모티콘 지원 애드온을 사용하셔도 되고요.

  • profile profile

    utf8mb4로 변환되었을 때 varchar 형이 255로 필드가 확장되는 것인지요?
    어떤 것들이 varchar 형이 191에서 255로 필드가 확장되는지 알 수 있을까요?

  • profile profile
    아뇨, 필드 크기가 자동으로 커지지는 않습니다.

    utf8에서는 varchar(255) 필드에도 인덱스를 걸 수 있지만, utf8mb4에서는 varchar(191)을 초과하는 필드에는 인덱스를 걸 수 없습니다. 인덱스를 걸 수 있는 필드의 최대 크기가 제한됩니다.

    이 차이 때문에 일부 모듈이 테이블이나 인덱스를 생성할 수 없는 문제가 생기기도 하는데 (varchar 길이를 쓸데없이 길게 선언해 놓은 경우가 많아요...) 이미 utf8mb4로 변환하신 상태에서 utf8로 돌아가려고 하신다면 해당 없습니다.
  • profile profile
    utf8에서는 기본적으로 text 자료형을 사용하고 utf8mb4에서는 mediumtext 자료형을 사용하던데 utf8mb4에서 utf8으로 돌아가려면 해당 부분을 수정해줘야 하나요?
  • profile profile

    그것도 문자셋과는 상관없는 부분인데요. XE에서 글 내용에는 대개 longtext를 사용합니다.

  • profile profile
    친절한 답변 감사합니다! 많은 도움이 되었습니다 ㅎㅎ