IT is Smart
파이썬 MySQL Incorrect string value 에러 조치하기 본문
요즘은 다국어를 처리해야 하는 상황이 매우 일반적입니다. 여러 나라의 문자를 저장할 수 있도록 UTF-8 character set이 대부분 지원이 되는데 UTF-8모드에서도 에러가 발생하는 경우를 발견하여 조치방법을 정리해둡니다.
저의 경우 중국어 기사를 크롤링해서 database에 저장하는 프로그래밍을 하고 있는데 대부분의 기사들이 정상적으로 저장되는데 일부 기사가 에러로 떨어지는 경우가 있었습니다. 아래와 같은 에러메시지입니다.
(1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x82' for column 'article' at row 1")
먼저 해당 에러를 일으킨 기사 내용을 뽑아 봤습니다.
wuli艺术家崔塔塔ins更新照片一张,这个照片原型是电影老无所依里的杀手安东,冷血无情杀人 不眨眼而且战斗力爆表。我塔塔真的是绝版艺术家。而且鬼神大人发了一次还删了,重新换了滤镜。 毕竟像老崔这样的神一般人是理解不了。更何况还换上了自己的眼睛鼻子~原来你是这样的自黑男神😂
이 기사의 가장 끝에 특수문자가 있습니다. 😂 이 문자의 ASCII 코드값이 바로 위의 에러 메시지에 나오는 '\\xF0\\x9F\\x98\\x82' 이것이었습니다.
구글링으로 원인을 찾다보니 이 특수문자는 4bytes인데 MySQL의 utf8은 3bytes까지만 지원하기 때문이라는 것을 알았습니다. 이에 대한 해결책으로 utf8mb4로 character set을 설정하면 된다는 것을 찾았습니다.
우선 oracle의 tablespace에 해당하는 MySQL의 SCHEMA의 Collation을 utf8mb4-defualt collation으로 변경했습니다. 그리고, 테이블을 생성할 때에도 character set을 설정해 줬습니다.
CREATE TABLE `document` ( `targetID` int(8) NOT NULL, `url` varchar(200) NOT NULL, `title` varchar(1000) NOT NULL, `article` varchar(4000) NOT NULL, `fromSite` varchar(50) NOT NULL, `writeDate` varchar(40) DEFAULT NULL, `writer` varchar(100) DEFAULT NULL, `viewCount` int(8) DEFAULT NULL, `isAnalysed` varchar(1) DEFAULT 'N', PRIMARY KEY (`targetID`,`url`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
그리고 마지막으로 파이썬에서 database connection을 생성할 때에도 utf8mb4를 명시해주고나서야 위의 에러가 났던 기사가 정상적으로 저장되는 것을 확인할 수 있었습니다.
# Open database connection db = MySQLdb.connect(host="localhost", user="user id", passwd="password", db="db name") db.set_character_set('utf8mb4')
위와 같은 오류를 만나게 되면 저와 같은 문제일 수 있으니 참조하시기 바랍니다.
'Case Study > How to' 카테고리의 다른 글
[클린코드] 발음하기 쉬운 이름을 사용하자 (0) | 2018.06.23 |
---|---|
[클린코드] 이름은 반드시 의미있게 구분하자 (0) | 2018.06.23 |
[클린코드] 그릇된 정보를 코드에 남기지 말라 (0) | 2018.06.23 |
Toad for MySQL에서 SQL파일 열때 뻗어버리는 현상 해결하기, When open sql files in Toad for MySQL. (2) | 2016.09.17 |
Python3.5와 MySQL연동을 위한 Client 설치하기 (0) | 2016.09.06 |