기록

[Docker] MySQL/mariadb 한글 인코딩 오류

돌멩이1 2022. 5. 26. 00:50

docker를 이용해 mysql container를 생성하고 초기화하는 과정에서 인코딩 오류가 발생했다.

한글 인코딩이 깨졌다.

MySQL은 8.0부터 default character set이 utf8mb4로 변경되었고 그 이전 버전들은 default가 latin1이기 때문에 한글을 사용하려면 별도의 설정이 필요하다.

Docker의 MySQL 이미지는 아래 옵션을 사용하면 server와 db의 default character set을 변경할 수 있다.
(아래 경우는 config설정을 하지 않고 설정하는 방법이다.)

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

server, database의 character set이 utf8mb4로 바뀌었다.

 

이 상태에서 INSERT 쿼리를 실행하거나 init.sql을 실행할 경우에 한글이 정상적으로 입력되는 것을 확인했지만. 도커에서 제공하는 /docker-entrypoint-initdb.d를 통한 초기화일때는 작동을 하지 않았다.

컨테이너 내부에서 sql문을 실행할 때 client를 사용하는 것으로 추측되었고, 그렇기 때문에 latin1 설정으로 한글을 입력해 인코딩이 깨지는것이라고 판단하였다.

그래서 /etc/mysql/conf.d 폴더에 my.cnf를 마운팅해주고 컨테이너를 실행하였다.

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

[mysqldump]
default-character-set=utf8mb4

 하지만 Warning : World-writable config file '/etc/mysql/conf.d/my.cnf/' is ignored 오류가 지속적으로 발생했다. 
구글링을 해본 결과 my.cnf파일의 권한을 755, 644 모두 해보았지만 동일한 오류가 계속 발생하였다.

그러던 중 해당 글을 읽고나서 Window의 경우 read-only의 권한을 요구하기 때문에 044 권한을 주어야한다는 것을 알았다.

그 이후 정상적으로 작동되는 것을 확인하였다.

linux와 window환경이 다르기 때문에 발생한 이슈였는데, mysql/mariadb의 공식문서 어디에서 해당 내용을 다루는지 찾아보고 추가로 업데이트를 하도록 하겠다.


결론 

/docker-entrypoint-initdb.d 초기화시 인코딩 오류가 난다면 cnf 파일을 이용해 초기화하자.

cnf 파일을 읽지 못하는 이슈가 발생할 경우 window환경에선 read-only (044) 권한으로 해결할 수 있다.

'기록' 카테고리의 다른 글

Spring data elasticsearch 4.4 환경 설정  (0) 2024.04.17