Wenn MySQL UTF-8-Codes von 4 Bytes oder mehr nicht verarbeiten kann, müssen Sie alle Unicode-Zeichen über den Codepunkt \U00010000
herausfiltern; UTF-8 codiert Codepunkte unterhalb dieses Schwellenwerts in 3 Byte oder weniger.
Sie könnten dafür einen regulären Ausdruck verwenden:
>>> 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: '
Alternativ können Sie .translate()
verwenden Funktion
mit einer Zuordnungstabelle, die nur None
enthält Werte:
>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '
Das Erstellen der Übersetzungstabelle verbraucht jedoch viel Speicher und nimmt einige Zeit zum Generieren in Anspruch; Es lohnt sich wahrscheinlich nicht, da der Ansatz mit regulären Ausdrücken effizienter ist.
Dies alles setzt voraus, dass Sie eine mit UCS-4 kompilierte Python verwenden. Wenn Ihr Python mit UCS-2-Unterstützung kompiliert wurde, können Sie nur Codepunkte bis '\U0000ffff'
verwenden in regulären Ausdrücken und Sie werden dieses Problem gar nicht erst bekommen.
Ich stelle fest, dass ab MySQL 5.5.3 der neu hinzugefügte utf8mb4
Codec
unterstützt den gesamten Unicode-Bereich.