Jeśli MySQL nie obsługuje kodów UTF-8 o długości 4 bajtów lub więcej, będziesz musiał odfiltrować wszystkie znaki Unicode w punkcie kodowym \U00010000
; UTF-8 koduje punkty kodowe poniżej tego progu w 3 bajtach lub mniej.
Możesz użyć do tego wyrażenia regularnego:
>>> 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: '
Alternatywnie możesz użyć .translate()
funkcja
z tabelą mapowania, która zawiera tylko None
wartości:
>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '
Jednak utworzenie tablicy translacji zużyje dużo pamięci i zajmie trochę czasu; prawdopodobnie nie jest to warte twojego wysiłku, ponieważ podejście oparte na wyrażeniach regularnych jest bardziej wydajne.
To wszystko zakłada, że używasz skompilowanego Pythona UCS-4. Jeśli twój python został skompilowany z obsługą UCS-2, możesz używać tylko punktów kodowych do '\U0000ffff'
w wyrażeniach regularnych i nigdy nie napotkasz tego problemu.
Zauważam, że od MySQL 5.5.3 nowo dodany utf8mb4
kodek
obsługuje pełny zakres Unicode.