Ternyata, masalahnya agak canggung. Singkatnya, sebagian besar variasi dan spesies di tipe data string MySQL memetakan ke tipe data tunggal di antarmuka MySQL dengan flag BINARY tambahan.
Jadi, VARCHAR
MySQL , VARBINARY
, dan peta literal string ke MySQLdb.constants.FIELD_TYPE.VAR_STRING
yang sama ketik definisi tipe kolom, tetapi memiliki MySQLdb.constants.FLAG.BINARY
tambahan tandai jika tipenya adalah VARBINARY
atau string yang disusun dengan *_bin
pengumpulan.
Meskipun ada MySQLdb.constants.FIELD_TYPE.VARCHAR
ketik, saya gagal mencari tahu kapan itu digunakan. Seperti yang saya katakan, MySQL VARCHAR
kolom dipetakan ke FIELD_TYPE.VAR_STRING
.
Solusinya menjadi agak rapuh, jika aplikasi Anda menggunakan string biner yang sebenarnya (misalnya, Anda menyimpan gambar dan mengambilnya dengan koneksi yang sama seperti teks), karena ini mengasumsikan decoding semua string biner menjadi unicode. Padahal, itu berhasil.
Sebagai dokumen resmi menyatakan:
Dalam praktiknya, kesulitan yang sebenarnya mungkin adalah proses membangun kamus konverter Anda sendiri. Tetapi Anda dapat mengimpor yang default dari MySQLdb.converters.conversions
dan menambalnya, atau bahkan menambalnya pada instance Connection. Triknya adalah menghapus konverter khusus untuk FLAG.BINARY
tandai dan tambahkan dekoder untuk semua kasus. Jika Anda secara eksplisit menentukan charset
parameter untuk MySQLdb.connect
, itu memaksa use_unicode=1
parameter, yang menambahkan dekoder untuk Anda, tetapi Anda dapat melakukannya sendiri:
>>> con = MySQLdb.connect(**params)
>>> con.converter[FIELD_TYPE.VAR_STRING]
[(128, <type 'str'>), (None, <function string_decoder at 0x01FFA130>)]
>>> con.converter[FIELD_TYPE.VAR_STRING] = [(None, con.string_decoder)]
>>> c = con.cursor()
>>> c.execute("SELECT %s COLLATE utf8_bin", u'м')
1L
>>> c.fetchone()
(u'\u043c',)
Anda mungkin perlu melakukan peretasan yang sama untuk FIELD_TYPE.STRING
jika diperlukan.
Solusi lain adalah dengan mengirimkan use_unicode=0
eksplisit ke MySQLdb.connect
dan membuat semua decoding dalam kode Anda, tetapi saya tidak akan melakukannya.
Harapan, ini mungkin berguna bagi seseorang.