Om MySQL inte kan hantera UTF-8-koder på 4 byte eller mer måste du filtrera bort alla unicode-tecken över kodpunkten \U00010000
; UTF-8 kodar kodpunkter under det tröskelvärdet i 3 byte eller färre.
Du kan använda ett reguljärt uttryck för det:
>>> 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: '
Alternativt kan du använda .translate()
funktion
med en mappningstabell som bara innehåller None
värden:
>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '
Men att skapa översättningstabellen kommer att ta upp mycket minne och ta lite tid att generera; det är förmodligen inte värt din ansträngning eftersom det vanliga uttryckssättet är mer effektivt.
Allt detta förutsätter att du använder en UCS-4-kompilerad python. Om din python kompilerades med UCS-2-stöd kan du bara använda kodpunkter upp till '\U0000ffff'
i reguljära uttryck och du kommer aldrig att stöta på det här problemet i första hand.
Jag noterar att från och med MySQL 5.5.3 den nyligen tillagda utf8mb4
codec
stöder hela Unicode-intervallet.