ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • StructuredConcorrency
  • java
  • restdocs custom
  • 인가(Authorization) 처리
  • nGrinder
  • FilterSecurityInterceptor
  • 동시성 제어
  • 구조화된 동시성
  • jpa
  • mysql
  • AccessDecisionVoter 커스텀
  • UserDetailsService
  • tree
  • 트랜잭션
  • nginx basic auth
  • node exporter basic auth
  • scope value
  • junit5
  • 가상 스레드 예외 핸들링
  • LocalDateTime
  • VirtualThread Springboot
  • AuthenticationException
  • querydsl
  • DataJpaTest
  • restdocs enum
  • AccessDecisionManager
  • 동일성
  • 정규표현식
  • 가상 스레드
  • 동등성

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

Docker MySQL 컨테이너 콘솔(터미널) 한글 입력 문제 해결
Docker

Docker MySQL 컨테이너 콘솔(터미널) 한글 입력 문제 해결

2023. 5. 12. 02:37

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
  • https://hub.docker.com/_/mysql

해당 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시 초기화 되는 일도 있었습니다.

참조

  • https://www.44bits.io/ko/post/setup_linux_locale_on_ubuntu_and_debian_container
  • SRE - yougc
저작자표시 비영리

'Docker' 카테고리의 다른 글

ubuntu, amazon linux2, centos7 도커 설치 명령어  (0) 2023.07.21
    'Docker' 카테고리의 다른 글
    • ubuntu, amazon linux2, centos7 도커 설치 명령어
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바