Explicamos en este artículo cómo solucionar el recurrente y desagradable error al crear una página web con PHP y mostrar datos desde MySQL o MariaDB y ver que las tildes (acentos), las eñes y otros caracteres propios del lenguaje castellano no se muestran bien. Explicamos toda la configuración necesaria tanto en los ficheros PHP, como en el propio PHP y el acceso a MySQL. Explicamos este «truco» para no tener que modificar nuestro código PHP, salvo añadir alguna línea de código y poco más.

Formato de los archivos de PHP a UTF-8

Todos los ficheros PHP y HTML de nuestro sitio web deben estar guardados en formato UTF-8, esto lo podemos hacer usando el notepad++, por ejemplo, desde el menú «Codificación» – «Codificar en UTF-8»:

Formato de los archivos de PHP a UTF-8

También podemos hacerlo desde el bloc de notas de Windows (notepad), pulsando en «Archivo» – «Guardar como» y eligiendo «UTF8» en el desplegable «Codificación»:

Formato de los archivos de PHP a UTF-8

Establecer el juego de caracteres en el encabezado de todos los ficheros HTML

Debemos establecer el juego de caracteres que estamos usando en todos los encabezados de todos los ficheros HTML que se generarán a partir de nuestros ficheros PHP. Esto es necesario para indicar al navegador del usuario con qué juego de caracteres debe mostrar la página.

Para ello es suficiente con añadir la línea de código HTML:

en el encabezado de todos los ficheros, quedando, por ejemplo:

Lo habitual es tener un fichero llamado «cabecera.php» que se incluirá en el resto de ficheros PHP de nuestro sitio web. Dicho fichero podría contener el siguiente código:

Y en cada fichero PHP hacer una inclusión de este fichero «cabecera.php», de la siguiente forma:

Así garantizamos que todos los archivos HTML generados en nuestro sitio web tendrán la etiqueta meta charset del juego de caracteres correctamente establecida. Podremos verificarlo en el navegador del cliente, en el caso de Firefox pulsando sobre el botón de menú y eligiendo «Desarrollador»:

Establecer el juego de caracteres en el encabezado de todos los ficheros HTML

Y «Código fuente de la página»:

Establecer el juego de caracteres en el encabezado de todos los ficheros HTML

Nos debe mostrar algo así:

Establecer el juego de caracteres en el encabezado de todos los ficheros HTML

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

Debemos establecer en la conexión a la base de datos MySQL o Maria DB el juego de caracteres que emplearemos, para ello podemos usar el siguiente código PHP:

Como vemos en el ejemplo, tras la conexión a la base de datos ejecutamos:

mysqli_set_charset($link, «utf8»);

para establecer el juego de caracteres con el que trabajaremos para la obtención de datos de MySQL o MariaDB.

También podemos ver que hemos usado una función «conectarBD» que devolverá el link de conexión. Cada vez que nos queramos conectar a la base de datos podemos hacerlo como en el siguiente ejemplo:

Es muy importante que las tablas y los campos de las tablas de MySQL tengan establecido el juego de caracteres «UTF8». Esto podremos comprobarlos desde phpMyAdmin. Por un lado el cotejamiento de la conexión al servidor que debe estar a utf8_general_ci:

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

Si queremos modificar mediante SQL el cotejamiento de conexión al servidor podemos usar:

Para cada tabla de nuestra base de datos, de nuestro catálogo MySQL o MariaDB debe tener establecido el cotejamiento «utf8_general_ci»:

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

Y para cada campo de tipo texto (varchar, text) también debe establecerse el cotejamiento «utf8_general_ci»:

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

Si necesitamos modificarlos podemos hacerlo desde el propio phpMyAdmin, pulsando en la tabla a modificar, luego en «Operaciones», elegiremos el nuevo cotejamiento «utf8_general_ci» y guardaremos los cambios pulsando en «Continuar»:

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

También podremos hacer estas modificaciones ejecutando código SQL:

Incluso si tenemos muchas tablas y no queremos ir una a una podemos generar un script SQL con la siguiente sentencia SQL:

La sentencia SQL nos generará un registro por cada tabla que tengamos en la base de datos especificada «nombre_catálogo» con el SQL necesario para modificar el cotejamiento. Sólo tendríamos que copiar el resultado del script en un campo de ejecución de SQL y ejecutarlo.

Para modificar el cotejamiento de los campos de texto de cada tabla procederemos de igual forma a la tabla, la seleccionaremos, pulsaremos en «Estructura», marcaremos los registros que usen cotejamiento (sólo los de texto):

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

y pulsaremos «Cambiar» en la parte inferior

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

Elegiremos el cotejamiento «utf8_general_ci» y pulsaremos «Guardar»:

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

También podemos modificarlo mediante sentencia SQL, sería algo así:

Todos estos cambios de cotejamiento en las tablas y campos de MySQL o MariaDB los podemos realizar con otras aplicaciones, por ejemplo con la aplicación gratuita y disponible en la web oficial de MySQL MySQL Workbench:

Configurar la base de datos MySQL o MariaDB, las tablas y los campos de las tablas a utf8

Una vez conocidas todas las opciones de configuración para mostrar correctamente los acentos, tildes, eñes y demás, los próximos desarrollos serán mucho más rápidos de configurar, pues habremos creado las tablas MySQL con el cotejamiento correcto, así como los ficheros PHP y el encabezado de cada HTML resultante.