Menulis kueri sederhana, mendapatkan unicodeEncodeError, python 2.7

Pertanyaannya:

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

Pesan kesalahan:

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

Kode:

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+"'"

Dalam hal ini nama tabelnya adalah 'ta_rest_review', user adalah 'KANNONEPL...' dan rt adalah 'Excelente pero \"OJO a la CUENTA\"'


person Lawrence DeSouza    schedule 26.10.2014    source sumber
comment
Anda memiliki karakter é di suatu tempat dalam nilai Anda, tetapi input sampel Anda tidak memiliki karakter tersebut.   -  person Martijn Pieters    schedule 26.10.2014
comment
Saat melaporkan masalah Python, selalu sertakan penelusuran balik. Jika itu adalah penugasan query sebenarnya, maka karakter é beraksen tersebut berada dalam nilai user atau tablename.   -  person Martijn Pieters    schedule 26.10.2014
comment
Dalam hal ini masalah Anda dengan UnicodeEncodeError disebabkan oleh pemanggilan str() pada objek unicode dengan karakter di luar rentang ASCII yang valid, masalah yang sama sekali berbeda dari postingan Anda mengomentari sebelumnya.   -  person Martijn Pieters    schedule 26.10.2014


Jawaban (1)


Anda tidak boleh menggunakan pemformatan string untuk menginterpolasi data Anda. Gunakan parameter SQL sebagai gantinya!

Gunakan sintaks parameter kueri yang sesuai untuk driver database Anda, baik itu akan menggunakan tanda tanya atau %s placeholder:

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

Anda masih harus menginterpolasi nama tabel (pastikan benar-benar nama tabel tersebut sudah ada, jangan ambil masukan pengguna untuk menentukannya!)

Driver database kemudian dapat menangani pelolosan nilai user dan rt dengan benar untuk Anda, termasuk mengkodekan nilai Unicode ke pengkodean yang didukung oleh database.

Selain itu, Anda menghindari risiko kelemahan keamanan injeksi SQL jika Anda mencoba 'melarikan diri' dari input database Anda sendiri.

Lihat dokumentasi driver database Anda; modul harus memiliki paramstyle variabel yang menentukan gaya placeholder parameter driver mendukung, serta menjelaskan jika beberapa gaya didukung.

person Martijn Pieters    schedule 26.10.2014
comment
Berhasil, terima kasih atas jawaban Anda. Aneh karena saya tidak dapat menemukannya di sini sebelumnya. - person Lawrence DeSouza; 26.10.2014