Se o MySQL não puder lidar com códigos UTF-8 de 4 bytes ou mais, você terá que filtrar todos os caracteres unicode no codepoint
\U00010000
; UTF-8 codifica codepoints abaixo desse limite em 3 bytes ou menos. Você pode usar uma expressão regular para isso:
>>> import re
>>> highpoints = re.compile(u'[\U00010000-\U0010ffff]')
>>> example = u'Some example text with a sleepy face: \U0001f62a'
>>> highpoints.sub(u'', example)
u'Some example text with a sleepy face: '
Como alternativa, você pode usar o
.translate()
função
com uma tabela de mapeamento que contém apenas None
valores:>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '
No entanto, a criação da tabela de tradução consumirá muita memória e levará algum tempo para ser gerada; provavelmente não vale a pena seu esforço, pois a abordagem de expressão regular é mais eficiente.
Tudo isso pressupõe que você esteja usando um python compilado pelo UCS-4. Se seu python foi compilado com suporte a UCS-2, você só poderá usar codepoints até
'\U0000ffff'
em expressões regulares e você nunca terá esse problema em primeiro lugar. Observo que, a partir do MySQL 5.5.3, o recém-adicionado
utf8mb4
codec
suporta toda a gama Unicode.