Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

masalah pemeriksaan mysql-python:bagaimana cara memaksa tipe data unicode?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tambahkan kolom kunci utama ke tabel lama tanpa kunci utama

  2. Jarak dalam meter antara dua Titik Spasial dalam kueri MySQL

  3. Bagaimana cara mengatasi OSError:mysql_config not found error selama penerapan Elastic Beanstalk?

  4. cara mengatasi gagal terhubung ke /192.168.15.186 (port 80):koneksi gagal:ETIMEDOUT (Waktu koneksi habis) di Windows Firewall

  5. Cara Menginstal MySQL 8.0 di RHEL/CentOS 8/7 dan Fedora 35