Pasar base de datos Mysql a la codificación utf8mb4
MySQL y utf8 parece que hace tiempo que pasaron a ser antiguas, ya las últimas versiones vienen por defecto en utf8mb4. ¿Y por qué? Muy sencillo utf8mb4 permite guardar más bytes en la codificación y de esta forma representar caracteres como los emojis.
Contenido
Pasos a seguir para pasar tu base de datos a utf8mb4
Hacer copia de seguridad de la base de datos
Debido a que es una operación muy delicada y el cambio de codificación puede corromper los datos, guarda una copia de seguridad:
mysql -u USERNAME -h HOSTNAMEORIP DATABASENAME -p
Ten a mano el usuario administrador y el reinicio
Para reiniciar el servicio de la base de datos:
service mariadb restart
Para acceder por consola como usuario administrador (esto es solo para PLESK, sino debes hacerlo de forma normal):
mysql -uadmin -p`cat /etc/psa/.psa.shadow`
Pasar todas las tablas a InnoDB
Debes repasar tus tablas y que todas sean InnoDB, existen dos posibilidad o esta o MyISAM que es la que no queremos. Normalmente ya todas las tablas son InnoDB pero mejor asegúrate.
Pasar la Base de Datos a utf8mb4
ALTER DATABASE foronum CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Configurar las variables globales
Puedes obtener los valores actuales con la siguiente consulta:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
Para configurar los valores que buscamos:
SET GLOBAL character_set_client = 'utf8mb4'; SET GLOBAL character_set_connection = 'utf8mb4'; SET GLOBAL character_set_database = 'utf8mb4'; SET GLOBAL character_set_results = 'utf8mb4'; SET GLOBAL character_set_server = 'utf8mb4'; SET GLOBAL collation_connection = 'utf8mb4_unicode_ci'; SET GLOBAL collation_database = 'utf8mb4_unicode_ci'; SET GLOBAL collation_server = 'utf8mb4_general_ci';
Si no se actualizan tendrás que incluirlo en el archivo my.cnf
En mi caso el archivo my.cnf esta en /etc/my.cnf y acontinuación deberás reiniciar la base de datos. Según he visto en algún blog solo surge efecto los cambios a las nuevas base de datos, las que ya están creadas hay que cambiarlas de la forma que antes indico.
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
character-set-client = utf8mb4
[mysql]
default-character-set = utf8mb4
Pasar todas las tablas a utf8mb4
Te servirá este script para generar un script de copiar y pegar de todas las tablas:
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ') AS alter_sql FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'nombre_bd'
Copia y pega y ejecútalo y se pasarán todas las tablas a formato utf8mb4 y su correspondiente codificación (collate). Después se recomienda pasar los varchar a 191
Si aún así te sigue sin funcionar prueba a ver:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'