Mysql
 sql >> Base de données >  >> RDS >> Mysql

Avertissement déclenché en insérant un unicode de 4 octets dans mysql

Si MySQL ne peut pas gérer les codes UTF-8 de 4 octets ou plus, vous devrez filtrer tous les caractères Unicode sur le point de code \U00010000; UTF-8 encode les points de code en dessous de ce seuil en 3 octets ou moins.

Vous pouvez utiliser une expression régulière pour cela :

>>> 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: '

Alternativement, vous pouvez utiliser le .translate() fonction avec une table de mappage qui ne contient que None valeurs :

>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '

Cependant, la création de la table de traduction consommera beaucoup de mémoire et prendra un certain temps à générer; cela ne vaut probablement pas la peine car l'approche par expression régulière est plus efficace.

Tout cela suppose que vous utilisez un python compilé UCS-4. Si votre python a été compilé avec le support UCS-2, vous ne pouvez utiliser que des points de code jusqu'à '\U0000ffff' dans les expressions régulières et vous ne rencontrerez jamais ce problème en premier lieu.

Je note qu'à partir de MySQL 5.5.3 le nouveau utf8mb4 codec prend en charge la gamme Unicode complète.