utf8mb4 https://www.carloscarrascal.com/ es Drupal: Actualizar MySQL a utf8mb4 https://www.carloscarrascal.com/blog/drupal-actualizar-mysql-utf8mb4 <article data-history-node-id="20" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Drupal: Actualizar MySQL a utf8mb4 </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Domingo, Marzo 5, 2017 - 20:24</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/drupal" hreflang="es">Drupal</a></div> <div class="field--item"><a href="/tags/mysql" hreflang="es">MySQL</a></div> <div class="field--item"><a href="/tags/utf8mb4" hreflang="es">utf8mb4</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>De una temporada a esta parte supongo que habréis visto el aviso en el panel de información de Drupal acerca de actualizar la base de datos para soportar UTF-8 de 4 bytes, con este mensaje:</p> <pre> 4 byte UTF-8 for mysql is not activated, but it is supported on your system. It is recommended that you enable this to allow 4-byte UTF-8 input such as emojis, Asian symbols and mathematical symbols to be stored correctly. See the <a href="https://www.drupal.org/node/2754539">documentation on adding 4 byte UTF-8 support</a> for more information.</pre> <p>Vale, ¿pero de que va todo esto? ¿Para que sirve esta actualización?</p> <h2>Diferencias entre UTF-8 y uft8mb4</h2> <p>UTF-8 es un juego de caracteres, o mejor dicho, un formato de codificación de caracteres, que implementa el estándar Unicode. Unicode está dividido en 17 códigos de área, y cada uno contiene 65,536 caracteres de 16 bits, de los que solamente está en uso alrededor del 10%. La mas importante de estas áreas o planos es el BMP (<em>Basic Multilingual Plane</em>), que contiene los caracteres mas usados. Entre ellos están los de Latín, alfabetos griego y cirílico, y hasta los juegos de caracteres asiáticos como los japoneses Katakana e Hiragana, o ideogramas chinos.</p> <p>Además, UTF-8 es de longitud variable, y usa hasta 3 bytes como máximo para representar un carácter, por lo que soporta todos los caracteres BPM. Con <em>utf8mb4</em> se pueden utilizar hasta 4 bytes, con lo que se gana un byte adicional que permite representar caracteres adicionales o <em>suplementarios</em>, y según el manual de MySQL:</p> <ul> <li>Para un carácter <em>BMP</em>, <em>utf8</em> y <em>utf8mb4</em> tienen el mismo almacenamiento: mismo código, misma codificación, misma longitud.</li> <li>Para un carácter suplementario, <em>utf8</em> no puede almacenarlo, mientras que <em>utf8mb4</em> necesita cuatro bytes para almacenarlo.</li> </ul> <p>Como utf8 no puede almacenar este tipo de caracteres, no hay problema al realizar la migración desde utf8 a <em>utf8mb4</em>, pero ojo, perderíamos información si queremos volver a pasar de <em>utf8mb4 a utf8, </em>ya que como hemos visto no se podrán almacenar todos los caracteres.</p> <h2>Actualizar a utf8mb4</h2> <p>Como tenia un rato libre me decidí a probar la actualización a <em>utf8mb4</em>​, eso si, sabiendo que no hay vuelta atrás, así que seguí las instrucciones de la página que nos enlaza desde Drupal:</p> <p><a href="https://www.drupal.org/node/2754539">documentation on adding 4 byte UTF-8 support</a></p> <p>Lo primero es editar el fichero de configuración de MySQL, normalmente en Debian en /etc/mysql/my.conf y añadir las siguientes líneas en el apartado de <em>[mysqld]</em>:</p> <pre> innodb_large_prefix=true innodb_file_format=barracuda innodb_file_per_table=true </pre> <p>Y reinicamos el servidor:</p> <pre> service mysql restart</pre> <p>Ahora tenemos que convertir nuestra vieja base de datos a <em>utf8mb4</em>, por lo que lo primero que haremos es <strong>hacer una copia de seguridad</strong>.</p> <p>¿Ya la tienes? ¿Seguro? Ok, luego no digas que no te he avisado.</p> <p>Vamos a utilizar el módulo experimental que nos dicen en la ayuda: utf8mb4_convert. No es exactamente un módulo, es una extensión de <em>Drush</em>, de forma que no tendremos que activarlo. Lo descargamos así:</p> <pre> drush @none dl utf8mb4_convert-7.x drush cc drush</pre> <p>Ahora, si tenemos alguna base de datos en nuestro archivo settings.php que no queramos convertir, la comentamos o la quitamos del fichero. Podemos nuestro portal en modo de mantenimiento (los programadores de verdad hacen esto a pelazo, pero vosotros veréis):</p> <pre> drush vset maintenance_mode 1</pre> <p>Y ejecutamos este comando de Drush que da un yuyu que te cagas:</p> <pre> drush utf8mb4-convert-databases</pre> <p>¿Tenías una copia de seguridad verdad?</p> <p>Bueno, pues modificamos la configuración del settings.php para <em>utf8mb4</em>:</p> <pre> $databases['default']['default'] = array( 'driver' =&gt; 'mysql', 'database' =&gt; 'databasename', 'username' =&gt; 'username', 'password' =&gt; 'password', 'host' =&gt; 'localhost', 'charset' =&gt; 'utf8mb4', 'collation' =&gt; 'utf8mb4_general_ci', );</pre> <p>Y probamos el portal. Si todo funciona, podemos quitar el modo de mantenimiento:</p> <pre> drush vset maintenance_mode 0</pre> <p>Y una cosa mas que hemos aprendido a hacer.</p> <p>Y si no funciona... bueno... pues déjame un comentario o tira de Stackoverflow...</p> <p> </p> <h2>Referencias</h2> <ul> <li><a href="https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html" target="_blank">https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html</a></li> <li><a href="http://www.sttmedia.com/unicode-basiclingualplane" target="_blank">http://www.sttmedia.com/unicode-basiclingualplane</a></li> <li><a href="https://en.wikipedia.org/wiki/Plane_(Unicode)" target="_blank">https://en.wikipedia.org/wiki/Plane_(Unicode)</a></li> <li><a href="https://www.drupal.org/project/utf8mb4_convert" target="_blank">https://www.drupal.org/project/utf8mb4_convert</a></li> <li><a href="https://www.drupal.org/node/2754539" target="_blank">https://www.drupal.org/node/2754539</a></li> </ul> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=20&amp;2=comment&amp;3=comment" token="jtHSIrb3ssKST-mcOv2EwGPqTrf6EHDsSXb8MjW_QiI"></drupal-render-placeholder> </section> </div> </article> Sun, 05 Mar 2017 19:24:40 +0000 root 20 at https://www.carloscarrascal.com