เขียนแบบสอบถามง่ายๆ รับ unicodeEncodeError, python 2.7.1

แบบสอบถาม:

query = "SELECT * from "+str(tablename)+" where user='"+str(user)+"' AND review_title='"+rt+"'"

ข้อความแสดงข้อผิดพลาด:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 3: ordinal not in range(128)

รหัส:

rt = review_title.replace("'", "\\'")
rt = rt.replace('"', '\\"')
rt = unicode(rt).encode('utf-8')
query = "SELECT * from "+str(tablename)+" where user='"+str(user)+"' AND review_title='"+rt+"'"

ในกรณีนี้ชื่อตารางคือ 'ta_rest_review', user คือ 'KANNONEPL...' และ rt คือ 'Excelente pero \"OJO a la CUENTA\"'


person Lawrence DeSouza    schedule 26.10.2014    source แหล่งที่มา
comment
คุณมีอักขระ é อยู่ที่ไหนสักแห่งในค่าของคุณ แต่อินพุตตัวอย่างของคุณไม่มีอักขระนั้น   -  person Martijn Pieters    schedule 26.10.2014
comment
เมื่อรายงานปัญหา Python เสมอ ให้รวมการย้อนกลับด้วย หากเป็นการกำหนด query จริง อักขระ é ที่เน้นเสียงนั้นจะอยู่ในค่า user หรือ tablename   -  person Martijn Pieters    schedule 26.10.2014
comment
ในกรณีนั้นปัญหาของคุณกับ UnicodeEncodeError เกิดจากการเรียก str() บนวัตถุ unicode ที่มีอักขระนอกช่วง ASCII ที่ถูกต้อง ซึ่งเป็นปัญหาที่แตกต่างไปจาก โพสต์โดยสิ้นเชิง คุณแสดงความคิดเห็นก่อนหน้านี้   -  person Martijn Pieters    schedule 26.10.2014


คำตอบ (1)


คุณไม่ควรไม่ใช้การจัดรูปแบบสตริงเพื่อแก้ไขข้อมูลของคุณ ใช้พารามิเตอร์ SQL แทน!

ใช้ไวยากรณ์พารามิเตอร์แบบสอบถามที่เหมาะสมสำหรับโปรแกรมควบคุมฐานข้อมูลของคุณ โดยจะใช้เครื่องหมายคำถามหรือตัวยึดตำแหน่ง %s:

cursor.execute(
    'SELECT * from {0} WHERE user=%s AND review_title=%s'.format(tablename),
    (user, rt)
)

คุณยังคงต้องแก้ไขชื่อตาราง (ตรวจสอบให้แน่ใจ แน่ใจอย่างยิ่ง ว่าเป็นชื่อตารางที่มีอยู่ อย่าใช้อินพุตของผู้ใช้เพื่อพิจารณาสิ่งนี้!)

โปรแกรมควบคุมฐานข้อมูลสามารถดูแลการหลีกเลี่ยงค่า user และ rt ได้อย่างถูกต้องสำหรับคุณ รวมถึงการเข้ารหัสค่า Unicode เป็นการเข้ารหัสที่ฐานข้อมูลรองรับ

ยิ่งไปกว่านั้น คุณจะหลีกเลี่ยงความเสี่ยงที่จะเกิดข้อบกพร่องด้านความปลอดภัยของการแทรก SQL หากคุณพยายาม 'หลีกเลี่ยง' อินพุตฐานข้อมูลของคุณด้วยตัวเอง

ดูเอกสารประกอบไดรเวอร์ฐานข้อมูลของคุณ โมดูลควรมี paramstyle ตัวแปร ที่กำหนดรูปแบบของตัวยึดตำแหน่งพารามิเตอร์ ไดรเวอร์รองรับพร้อมทั้งอธิบายว่ารองรับหลายสไตล์หรือไม่

person Martijn Pieters    schedule 26.10.2014
comment
นั่นได้ผล ขอบคุณสำหรับคำตอบของคุณ แปลกที่เมื่อก่อนฉันไม่พบมันที่นี่ - person Lawrence DeSouza; 26.10.2014