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.
- 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.
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»:
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»:
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:
1 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
en el encabezado de todos los ficheros, quedando, por ejemplo:
1 2 3 4 5 6 |
<!DOCTYPE html> <html lang="es"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Facturación a clientes</title> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php //Iniciamos sesiones if (session_status() == PHP_SESSION_NONE) { session_start(); } ?> <!DOCTYPE html> <html lang="es"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Facturación a clientes</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="Facturación a clientes"> <meta name="author" content="AjpdSoft - Proyecto A"> </head> <body> |
Y en cada fichero PHP hacer una inclusión de este fichero «cabecera.php», de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php //Iniciamos sesiones if (session_status() == PHP_SESSION_NONE) { session_start(); } require_once ("cabecera.php"); if (isset($_SESSION["user_login"])) { require_once ("listado_facturas.php"); } require_once ("pie.php"); ?> |
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»:
Y «Código fuente de la página»:
Nos debe mostrar algo así:
1 2 3 4 |
<!DOCTYPE html> <html lang="es"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function conectarBD() { $servidor = "proyectoa.com"; $usuario = "usuario"; $contrasena = "contraseña"; $baseDatos ="catalogo"; if (!($link = mysqli_connect($servidor, $usuario, $contrasena))) { echo "Error al conectar con el servidor de base de datos.<br/>"; exit(); } else { //echo "Conexión a la base de datos satisfactoria.<br/>"; } if (!mysqli_select_db($link, $baseDatos)) { echo "Error al conectar al servidor de BD, no existe la base de datos (catágo).<br/>"; exit(); } else { if (!mysqli_set_charset($link, "utf8")) { printf("Error cargando el conjunto de caracteres utf8: %s\n", mysqli_error($link)); exit(); } } return $link; } |
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:
1 2 3 4 5 6 |
if (!isset($link)) { $link = conectarBD(); } $consultaSQL = "DELETE FROM facturas WHERE codigo=3"; mysqli_query($link, $consultaSQL); |
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:
Si queremos modificar mediante SQL el cotejamiento de conexión al servidor podemos usar:
1 |
ALTER SCHEMA nombre_catálogo DEFAULT CHARACTER SET utf8 ; |
Para cada tabla de nuestra base de datos, de nuestro catálogo MySQL o MariaDB debe tener establecido el cotejamiento «utf8_general_ci»:
Y para cada campo de tipo texto (varchar, text) también debe establecerse el cotejamiento «utf8_general_ci»:
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»:
También podremos hacer estas modificaciones ejecutando código SQL:
1 |
alter table nombre_tabla DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; |
Incluso si tenemos muchas tablas y no queremos ir una a una podemos generar un script SQL con la siguiente sentencia SQL:
1 2 3 |
select concat ("alter table ", TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;") ScriptSQL from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA="nombre_catálogo" and TABLE_ENGINE="BASE TABLE"; |
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):
y pulsaremos «Cambiar» en la parte inferior
Elegiremos el cotejamiento «utf8_general_ci» y pulsaremos «Guardar»:
También podemos modificarlo mediante sentencia SQL, sería algo así:
1 2 3 4 |
ALTER TABLE nombre_tabla CHANGE nombre_campo nuevo_nombre_campo Tipo_De_Datos CHARACTER SET utf8 COLLATE utf8_general_ci; |
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:
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.