본문 바로가기
공부/프로그래밍

[airflow] Mysql의 캐릭터셋(charset)이 euc-kr 일 때(혹은 로드시 can't decode byte 0xb5에러가 날때)

by demonic_ 2020. 9. 7.
반응형

airflow 에서 제공하는 플러그인 중 쓰고있는 MySqlToGoogleCloudStorageOperator 는 기본 캐릭터 셋을 utf-8로 인식한다. 그런데 DB에서 설정하는 스키마가 utf8이 아닐경우 로드 하다보면 다음과 같은 에러를 발생시킨다.

ERROR - 'utf-8' codec can't decode byte 0xb5 in position 0: invalid start byte
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/airflow/models/taskinstance.py", line 983, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/Users/dgpark/airflow/dags/mysql_to_gcs/modules/MysqlToGCS.py", line 106, in execute
    cursor = self._query_mysql()
  File "/Users/dgpark/airflow/dags/mysql_to_gcs/modules/MysqlToGCS.py", line 131, in _query_mysql
    cursor.execute(self.sql)
  File "/usr/local/lib/python3.7/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.7/site-packages/MySQLdb/cursors.py", line 317, in _query
    self._post_get_result()
  File "/usr/local/lib/python3.7/site-packages/MySQLdb/cursors.py", line 352, in _post_get_result
    self._rows = self._fetch_row(0)
  File "/usr/local/lib/python3.7/site-packages/MySQLdb/cursors.py", line 325, in _fetch_row
    return self._result.fetch_row(size, self._fetch_type)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 0: invalid start byte

 

캐릭터셋이 다르다보니 해석할 수 없는 언어가 나오고 에러가 난 것인데, 일단 데이터베이스 스키마가 어떤 charset을 사용하는지 먼저 살펴볼 필요가 있다.

SELECT 
    default_character_set_name, DEFAULT_COLLATION_NAME
FROM
    information_schema.SCHEMATA
WHERE
    schema_name = '[스키마명]';

 

실제로 내경우 euc-kr로 되어있었다.

 

그렇다면 어떻게 해야할까? 바로 접속정보에서 설정해주면 된다.

이전에 환경설정으로 접속정보를 저장한다고 말한 바 있다.

관련글:

lemontia.tistory.com/957

 

[airflow] Mysql 데이터를 GCS(Google Cloud Storage)로 저장하기(mysql_to_gcs, 한글깨짐, 날짜포멧 수정)

Data lake 를 구축하기 위한 1단계인 원본데이터를 GCS로 이동하는 것을 다뤄보려 한다. embulk를 쓸까도 했었는데, JAVA 1.8 버전 이후부터는 지원을 안하기도 했고, 관리포인트를 늘리는 것도 좋아보��

lemontia.tistory.com

 

환경변수를 설정할때 캐릭터 셋을 다음과 같이 설정하면 불러올때 온전히 가져올 수 있다.

export AIRFLOW_CONN_MYSQL_TEST='mysql://[username]:[password]@[hostname]:[port]/[schema]?charset=euckr'

끝에 charset=euckr 로 설정.

 

 

끝.

반응형

댓글