MySQL y Unicode de 4 bytes

Pues ando con los cambios de HablaJapones.org

Importando algunos kanjis me dí cuenta que se estaban agregando mal algunos… y oh sorpresa!!! Hay caracteres unicode de 4 bytes (normalmente solo son de 3). Revisando ya vi que en todos lados dicen que es de 1-4, pero en la practica me había tocado solo 3 bytes…

He vivido engañado toda mi vida…

Al parecer MySQL 5.1 solo soporta utf8 (un subset de unicode de 3 caracteres). En MySQL 5.5.3+ agregaron utf8mb4 que ya soporta 4 bytes (UTF8 completo).

Por ejemplo 本 ocupa solo 3 caracteres:

c='本'
c.encode()
b'\xe6\x9c\xac'

Sin embargo, http://graphemica.com/%F0%A0%98%A8 necesita 4 caracteres:

c='' #revisar el kanji en http://graphemica.com/%F0%A0%98%A8
c.encode()
b'\xf0\xa0\x98\xa8'

Aquí hay información de UTF8 y caracteres unicode:

http://es.wikipedia.org/wiki/UTF-8

Ahora bien, MySQL 5.1 soporta nativo solo unicode de 3 caracteres (utf8), pero MySQL 5.5.3+ soporta unicode de 4 caracteres (utf8mb4).

Solución (para caracteres japoneses por ejemplo):

  • Usar MySQL 5.5.3+
  • Después de conectarse, no esta de mas ejecutar ‘SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci’
  • Usar de default el utf8mb4 y el collation utf8mb4_unicode_520_ci
  • utf8mb4 es un superset de utf8, así que todo debe seguir igual.
  • Si no se usa utf8mb4_unicode_520_ci al buscar caracteres extendidos u+20000 todos los toma como iguales, así que los select devolverá un montón en vez de solo el que debe

Referencia:
https://mathiasbynens.be/notes/mysql-utf8mb4
http://bugs.mysql.com/bug.php?id=69679

2 thoughts on “MySQL y Unicode de 4 bytes”

Leave a Reply