Docker MySQL 컨테이너 콘솔(터미널) 한글 입력 문제 해결
Docker MySQL Container 콘솔(터미널) 에서 한글 입력이 되지 않는 경우에 해결한 방법에 대해 기록합니다.
결론부터 말씀드리면, 컨테이너의 로케일 설정 때문입니다.
해당 컨테이너의 리눅스 배포판에 맞춰 로케일 설정을 바꿔주면 됩니다.
상황 - 한글 입력 무시
한글 입력이 되지 않는 상황은 다음과 같습니다
select * from '사원';
위 명령어 입력시
select * from '';
식으로 한글 입력이 무시되어 입력 되지 않습니다.
버전마다 상이할 수 있지만, 이 글에서는 MySQL 공식 이미지 + 오라클 리눅스 기준으로 해결법을 정리하겠습니다.
MySQL 컨테이너 정보 확인
MySQL Charset 확인
MySQL charset 설정은 uf8로 다음과 같이 문제없이 되어있었습니다.
mysql> show variables like 'c%';
+----------------------------------------------+--------------------------------+
| Variable_name | Value |
+----------------------------------------------+--------------------------------+
| caching_sha2_password_auto_generate_rsa_keys | ON |
| caching_sha2_password_digest_rounds | 5000 |
| caching_sha2_password_private_key_path | private_key.pem |
| caching_sha2_password_public_key_path | public_key.pem |
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
| character_set_database | utf8mb3 |
| character_set_filesystem | binary |
| character_set_results | utf8mb3 |
| character_set_server | utf8mb3 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
| check_proxy_users | OFF |
| collation_connection | utf8mb3_general_ci |
| collation_database | utf8mb3_unicode_ci |
| collation_server | utf8mb3_unicode_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| connection_memory_chunk_size | 8912 |
| connection_memory_limit | 18446744073709551615 |
| core_file | OFF |
| create_admin_listener_thread | OFF |
| cte_max_recursion_depth | 1000 |
+----------------------------------------------+--------------------------------+
컨테이너 이미지 정보 확인
해당 컨테이너 이미지 정보는 다음과 같습니다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest be430b9d80e5 3 months ago 527MB
해당 MySQL 컨테이너 리눅스 정보는 다음과 같습니다.
- 리눅스 배포판 버전 확인 명령어
cat /etc/*-release | uniq
컨테이너 내부에 들어가서 명령어를 치면 됩니다
docker exec -it 컨테이너이름 bash (또는 /bin/bash)
명령어 및 결과 확인
$ cat /etc/*-release | uniq
Oracle Linux Server release 8.7
NAME="Oracle Linux Server"
VERSION="8.7"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="8.7"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Oracle Linux Server 8.7"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:8:7:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"
ORACLE_BUGZILLA_PRODUCT="Oracle Linux 8"
ORACLE_BUGZILLA_PRODUCT_VERSION=8.7
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=8.7
Red Hat Enterprise Linux release 8.7 (Ootpa)
Oracle Linux Server release 8.7
- 오라클 리눅스 인것을 확인했습니다.
- 혹시라도 패키지 관리자가 궁금하시다면 microdnf 또는 dnf 입니다.
$ microdnf install
$ dnf install
해결 방법
도커 컨테이너의 리눅스 로케일 설정을 바꿔해결할 수 있습니다.
로케일(Locale): 언어, 지역, 코드셋
로케일은 일반적으로 language_territory.codeset
형식으로 표현 됩니다. 언어(language
)는 ISO 639-1, 지역(territory
)은 ISO 3166-1을 따르며, 코드셋(codeset
)에는 UTF-8나 EUC-KR과 같은 값이 올 수 있습니다. 이 값들의 조합으로 하나의 로케일이 정의됩니다.
locale
명령어를 사용해 현재 MySQL 컨테이너의 로케일 설정을 확인할 수 있습니다.
$ locale
로케일 정보 확인
$ locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
로케일이 POSIX로 되어있었습니다.
POSIX?
POSIX 로케일은 "Portable Operating System Interface"의 약자로, UNIX 및 UNIX-like 운영 체제에서 텍스트 및 문자열 처리를 위한 표준 인터페이스를 정의하는 표준입니다. POSIX 로케일은 지역화와 관련하여 텍스트의 형식화, 숫자 및 날짜 형식, 통화 표시 등과 같은 다양한 언어 및 문화 관련 설정을 처리하는 방법을 규정합니다.
- 한글은 C.UTF-8 이나 ko_KR.UTF-8 을 이용해야 합니다.
해당 Locale을 POSIX에서 C.UTF-8로 바꿔주면 됩니다.
현재 사용가능한 로케일 확인 명령어
$ locale -a
C
C.utf8
POSIX
ko_KR.UTF-8 Locale을 사용하고 싶다면? - 다운로드
#ko_KR 로케일 설치
$ dnf install -y langpacks-ko
~~~ 설치
# 로케일 설치 확인
$ locale -a
C
C.utf8
POSIX
ko_KR.euckr
ko_KR.utf8
1. Docker Locale 설정
현재 사용 가능한 로케일은 C.UTF-8 이니 이 값을 컨테이너 실행 시 옵션으로 설정해주면 되는데,
다음과 같이 컨테이너 시작시 환경변수 값에 넘겨주면 됩니다.
$ docker run -it -e LC_ALL=C.UTF-8 mysql
저는 다음과 같은 방법으로 실행하였습니다.
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=????
-e LC_ALL=C.UTF-8 -p 3306:3306 -it -d -v /Users/ysk/dev/MySQL/data:/var/lib/mysql mysql
하고나면 한글입력이 문제없이 잘 됩니다.
- 해당 컨테이너를 도커이미지로 만들어서 사용하면 더 편리하게 사용할 수 있습니다.
2. 리눅스 명령어로 Locale 설정 변경
다음과 같은 명령어를 입력합니다.
$ export LC_ALL="C.UTF-8"
$ export LANG="C.UTF-8"
다음과 같이 확인할 수 있습니다.
$ export LC_ALL="C.UTF-8"
$ export LANG="C.UTF-8"
$ locale
LANG=C.UTF-8
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=C.UTF-8
하지만 이 방법은 이미 실행된 컨테이너라면 가끔씩 안먹히거나, restart시 초기화 되는 일도 있었습니다.