Acontece que o problema é bastante estranho. Em resumo, a maioria das variedades e espécies em tipos de dados de string MySQL mapear para um único tipo de dados na interface do MySQL com um sinalizador BINARY adicional.
Assim, o
VARCHAR
do MySQL , VARBINARY
, e um mapa literal de string para o mesmo MySQLdb.constants.FIELD_TYPE.VAR_STRING
digite nas definições de tipo de coluna, mas com um MySQLdb.constants.FLAG.BINARY
adicional sinalizar quando o tipo for VARBINARY
ou uma string agrupada com um *_bin
agrupamento. Mesmo que haja um
MySQLdb.constants.FIELD_TYPE.VARCHAR
type, não consegui descobrir quando é usado. Como eu disse, MySQL VARCHAR
colunas mapeadas para FIELD_TYPE.VAR_STRING
. A solução se torna bastante frágil, se seu aplicativo usa strings binárias verdadeiras (por exemplo, você armazena imagens e as busca com a mesma conexão que o texto), pois assume a decodificação de todas as strings binárias para unicode. Embora, ele funciona.
Como documentos oficiais afirma:
Na prática, uma verdadeira dor de cabeça pode ser o processo de construir seu próprio dicionário de conversores. Mas você pode importar o padrão de
MySQLdb.converters.conversions
e corrigi-lo, ou até mesmo corrigi-lo em uma instância do Connection. O truque é remover um conversor especial para um FLAG.BINARY
sinalizar e adicionar um decodificador para todos os casos. Se você especificar explicitamente um charset
parâmetro para MySQLdb.connect
, força use_unicode=1
parâmetro, que adiciona o decodificador para você, mas você pode fazer isso sozinho:>>> 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',)
Talvez você precise fazer o mesmo hack para
FIELD_TYPE.STRING
se necessário. Outra solução é passar
use_unicode=0
explícito para MySQLdb.connect
e fazer todas as decodificações no seu código, mas eu não faria. Espero que isso possa ser útil para alguém.