2011-12-29 2 views
3

I DB에 데이터를 밀어 다음 파이썬 코드가 있습니다파이썬 % s 형식 지정자

cursor.execute("INSERT INTO "+ DATA_TABLE + """ (fk_id, title, streetaddress,json) 
       values (%(fk_id)s, %(title)s, %(address)s, %(json)s) """ ,(
       result)) 

을하지만 오류 얻을 : 그것은 때문에

File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 185, in unicode_literal 
    return db.literal(u.encode(unicode_literal.charset)) 
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256) 

인가를 % s는 dict이 utf-8 문자열을 제공하는 동안 값이 유효한 라틴 -1 문자열이 될 것으로 예상합니까? 깨끗한 해결 방법은 무엇입니까?

참고 : json은 json.dumps을 사용하여 안전하게 만들어집니다. 그것은 여러 언어의 여러 문자가 있습니다.

+1

-1 : 이와 같은 SQL 문을 작성하지 마십시오. "Little Bobby Tables"에 대한 Google –

+0

@ S.Lott : 'DATA_TABLE' 변수가 사용자 입력에서 온 것이 아니라고 가정하면이 코드는 SQL 주입에 취약하지 않습니다. –

+0

@ 루크 우드워드 : 귀하의 가정은 종종 사실이지만, 그것이 사실이 아닌 때가 치명적입니다. 또한 이와 같은 SQL을 구축하는 것은 비효율적입니다. API에서 올바른 값 바인딩을 사용한다는 것은 RDBMS 백엔드가 값이 바인딩되는 단일 표준 쿼리와 함께 작동한다는 것을 의미합니다. 이렇게하면 구문 분석 시간이 절약되고 성능을 획기적으로 향상시킬 수 있습니다. –

답변

4

당신은 유니 코드

cursor.execute(u"INSERT INTO "+ unicode(DATA_TABLE) + u""" (fk_id, title, streetaddress,json) 
       values (%(fk_id)s, %(title)s, %(address)s, %(json)s) """ ,(
       result)) 

에 모든 문자열을 변환 http://mysql-python.sourceforge.net/MySQLdb.html

+0

). @ xaview-combelle의 답변 주셔서 감사합니다.하지만 여전히 작동하지 않습니다. 나는 UnicodeEncodeError : latin-1 '코덱은 0-5 위치의 문자를 인코딩 할 수 없습니다. 서수는 범위 내에 있지 않습니다 (256)'this this very 같은 줄. – jerrymouse

0

에 명시된 바와 같이 나는이 문제로 생각하지 않는 캐릭터 세트는 = "UTF-8"연결을 통과하는 것을 시도해야 파이썬 % s 서식 지정 코드. python string formatting documentation에 따르면, 유니 코드를 w/o 문제로 포맷 할 수 있습니다. 그러나 결과 문자열은 유니 코드입니다.

관련 질문을 모두 보셨습니까? How to make MySQL handle UTF-8 properly?