본문 바로가기

강좌/Python

Python 에서 Mysql 에 한글, 특수문자 혹은 이모티콘 입력 시 Incorrect string value 와 같은 에러가 발생할 경우

작성자 : Deok



Python 에서 Mysql Insert 사용시 아래와 같이  Incorrect string value 에러가 할 경우 원인은 보통 2가지 입니다.

 Incorrect string value: '\xF3\xB0\x8B\xAF\xEA\xB8' for column 'content' at row 1


원인 1. Mysql 혹은 MariaDB 의 Charter set ( 문자셋 ) 문제


  보통 DB 의 Charter set 문제일 경우가 많습니다. 이 경우 DB 의 Character set 을 utf8 혹은 utf8mb4 로 변경해 주시거나 업데이트 해주시면 됩니다.


테이블 업데이트 쿼리는 대충 아래와 같습니다. 


ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
ALTER TABLE table_name CHANGE column_name TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci




원인 2. Python mysql 의 접속 설정 문제


 제가 격은 문제 입니다. DB 의 생성은 Laravel 로 utf8mb4로 생성하고 Python 으로 콘텐츠를 넣는데 위와 같은 에러가 발생 하였고 원인은 mysql connect 옵션에서 utf8mb4 를 지정해줘야 하는 문제 였습니다. 


def connectMydb():
	print 'connectMydb'
	mydb = mysql.connector.connect(
	  host=str(os.environ.get("DB_HOST")),
	  user=str(os.environ.get("DB_USER")),
	  passwd=str(os.environ.get("DB_PASS")),
	  database=str(os.environ.get("DB_DATABASE"))
	)
	return mydb


위와 같은 코드에 아래와 같이 charset='utf8mb4' 를 추가 하였습니다.

def connectMydb():
	print 'connectMydb'
	mydb = mysql.connector.connect(
	  host=str(os.environ.get("DB_HOST")),
	  user=str(os.environ.get("DB_USER")),
	  passwd=str(os.environ.get("DB_PASS")),
	  database=str(os.environ.get("DB_DATABASE")),
	  charset='utf8mb4',
	)
	return mydb


기본적으로 python mysql 에서 접속 옵션으로 utf8 을 사용하는지 한글은 잘 동작하는데 특수 문자가 들어가려 하니 위와 같은 에러가 발생 했었습니다. 이제 한번 Python 을 통해서 해당 Insert 가 잘 동작하는지 한번 테스트 해보시기 바랍니다 :D


즐거운 개발 되시기 바랍니다.