سؤال

هذا المنصب هو نفسه مع سؤالي في الخلية في بايثون:UnicodeEncodeError:'ascii' هذا فقط لتوضيح الأمور.

أنا أحاول إنقاذ سلسلة إلى قاعدة بيانات MySQL ولكن تظهر لي رسالة خطأ:

ملف ".smart.py" الخط 51 ، (رقم النص ، 'الذكية', 'u')

UnicodeDecodeError:'ascii' لا يمكن فك ترميز بايت 0xc2 في موقف 25:ترتيبي في مجموعة(128)

و السلسلة يتم حفظها في م['Text']

لالا*=#&%@<>_?!:;-'"/()¥¡¿

هنا مقتطف الشفرة

risk = m['Text']
msg = risk.encode('utf8')
text = db.escape_string(msg)

sql = "INSERT INTO posts(nmbr, \
       msg, tel, sts) \
       VALUES ('%s', '%s', '%s', '%s')" % \
       (number, text, 'smart', 'u')

إذا حاولت التعليق الخروج استعلام SQL ووضع طباعة النص فإنه طباعة لالا*=#&%@<>_?!:;-'"/()¥¡¿

الخطأ هو فقط عندما واجه SQL قيد المعالجة.

الخلية ترميز مجموعة utf8_unicode_ci.(أو يجب تغيير هذا؟)

شكرا

هل كانت مفيدة؟

المحلول

إضافة هذه المعلمات MySQLdb.connect(..., use_unicode=1,charset="utf8").

إنشاء المؤشر

cur = db.cursor()

ومن ثم تنفيذ مثل ذلك:

risk = m['Text']
sql = """INSERT INTO posts(nmbr, msg, tel, sts) \
         VALUES (%s, %s, %s, %s)"""
values = (number, risk, 'smart', 'u')
cur.execute(sql,values)  #use comma to separate sql and values, this will ensure values are escaped/sanitized
cur.commit()

الآن أنت لا تحتاج هذه خطين:

msg = risk.encode('utf8')
text = db.escape_string(msg)

نصائح أخرى

فإنه ليس من الواضح ما إذا كان الخاص بك m['Text'] قيمة من نوع StringType أو UnicodeType.أراهن أنه بايت-سلسلة (StringType).إذا كان هذا صحيحا ، ثم إضافة خط m['Text'] = m['Text'].decode('UTF-8') قبل إدراج الخاص بك قد تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top