Se MySQL non è in grado di gestire codici UTF-8 di 4 byte o più, dovrai filtrare tutti i caratteri Unicode su codepoint \U00010000
; UTF-8 codifica i punti di codice al di sotto di tale soglia in 3 byte o meno.
Potresti usare un'espressione regolare per questo:
>>> 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: '
In alternativa, puoi utilizzare .translate()
funzione
con una tabella di mappatura che contiene solo None
valori:
>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '
Tuttavia, la creazione della tabella di traduzione consumerà molta memoria e richiederà del tempo per generarla; probabilmente non vale la pena perché l'approccio delle espressioni regolari è più efficiente.
Tutto ciò presuppone che tu stia utilizzando un Python compilato con UCS-4. Se il tuo python è stato compilato con il supporto UCS-2, puoi utilizzare solo codepoint fino a '\U0000ffff'
nelle espressioni regolari e non incontrerai mai questo problema in primo luogo.
Prendo atto che a partire da MySQL 5.5.3 il nuovo utf8mb4
codec
supporta l'intera gamma Unicode.