반응형
안녕하세요 펭귄 교수입니다.
이번에 Docker로 회사 구내식당 메뉴 페이지를 만들다가 만난 에러에 관해 분석하고, 해결 방법에 관해 글 써보겠습니다.
에러 분석
pymysql.err.DataError:
(1366, "Incorrect string value: '\\xED\\x83\\x84\\xED\\x83\\x84...' for column
'lunch_1_menu' at row 1")
Front (nginx) 에서 Back (Flask) 으로 메뉴를 등록하기 위해 HTTP POST 방식으로 데이터를 전송,
Back (Flask)는 DB(mysql)에 INSERT 하는 과정에서 해당 에러가 발생하였습니다.
Back에서 로그를 찍었을 때는 정상적으로 한글이 입력되지만, DB로 INSERT 할 때는 한글이 유니코드로 작성돼 해당 에러가 발생하는 것으로 보입니다.
INSERT INTO menu
( date, lunch_1_menu, lunch_1_kcal, lunch_2_menu, lunch_2_kcal,
lunch_sub_menu, lunch_sub_kcal, dinner_menu, dinner_kcal )
VALUE ( '2024-09-02', '탄탄멘,추가밥,모듬춘권*칠리S,짜사이채무침,타트체리주스,배추김치', 123,
'쇠고기미역국, 잡곡밥, 매콤제육김치볶음, 콩나물무침, 브로컬리*초장, 깍두기', 123,
'청포조젤리,매실주스', 123,
'보글보글*떡만두국,잡곡밥,충무식오징어무침연근땅콩조림,고들빼기무침,석박지', 123 )
위에 값은 Flask에서 query를 print한 결과 값입니다.
만약 Docker에서 Flask에서 Debug하는 Print 값이 출력되지 않는다면, print()에 flush=True 라는 옵션을 주고, logs를 찍어보면 확인 가능합니다.
파이썬 코드
print('로그', flush=True)
Bash 로그 확인
docker logs flask_server
그래서 해당 문제는 mysql 자체 문제로 보았고, 찾아보니 mysql의 utf8 문자셋은 UTF-8 인코딩을 부분적으로만 구현하여
4바이트 인코딩 방식인 한글에서 저렇게 유니코드로 깨져 보이는 것입니다.
에러 해결
이를 해결할 방법은 다음과 같습니다
1. mysql Docker에 접속
docker exec -it mysql /bin/bash
2. mysql utf8mb4 인코딩 적용
# mysql Docker Container 내부
mysql -u user -p
# 패스워드 입력 후 mysql 접속
# DB 접속
use [DB_NAME];
# DB 인코딩 변경
ALTER DATABASE [DB_NAME] CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# DB 내 Table 인코딩 변경
ALTER TABLE [TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
utf8mb4 인코딩은 MySQL 5.5.3 버전부터 지원하는 인코딩 방식입니다.
해당 정보에 대해서는 아래 공식 문서를 통해 더 알아보실 수 있습니다.
728x90
반응형
'프로그래밍 > Error' 카테고리의 다른 글
[티스토리 스킨 버그] 카테고리의 다른 글 두 개 표시, 해결 방법 (1) | 2024.09.27 |
---|---|
React Warning 해결 : Selector unknown returned a different result when called with the same parameters. This can lead to unnecessary rerenders. (0) | 2024.09.22 |
[티스토리 스킨 버그] 흰색 프로필 박스 해결 방법 (1) | 2023.11.23 |
[파이썬 venv] Visual Studio Code에서 venv 활성화가 되지 않을 때 (0) | 2023.05.30 |
파이썬 가상 환경 venv 활성화가 안돼요 (해결 방법) (1) | 2022.10.02 |