Error con acentos y eÑes en PHP/MySQL (Solucionado)

by
on May 23, 2009
(2 minute read)

Muchas veces al crear una web con PHP y MySQL, ocurre un problema al introducir y mostrar datos: estos se alteran acabando en áóñ y cosas parecidas.

Please donate to keep this server up

English version here

Cuando me pasa esto suelo empezar a toquetear cosas, cambiar charsets y traducir a ñ o á pero nada funciona. El problema es que la configuración del cotejamiento de los caracteres especiales como acentos, eñes y demás símbolos no es el mismo entre la base de datos (MySQL), el lenguaje de servidor (PHP) y el servidor (Apache). Así que me puse a buscar y después de encontrar comentarios buenísimos de gente por los foros puedo hacer un resumen de todo lo necesario cuando nos ocurre un problema de estos (id haciendo y testeando si ya funciona todo bien paso a paso).

Guía paso a paso para solucionar el problema de los acentos y eñes

  1. Cotejamiento
    Al crear la base de datos MySQL, asegúrate que los campos string y demás esten en utf8_spanish_ci y el cotejamiento de las tablas en utf_unicode_ci (más tarde en Operations > Collation de phpMyAdmin se puede cambiar)
  2. Content type HTML
    Pon en el <head> de todos los archivos HTML:
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  3. Content type PHP
    Y en los puramente PHP (que muestran XML, llamadas de AJAX, APIs…) pon el código:
    header("Content-Type: text/html;charset=utf-8");
  4. Set names
    Al crear la conexión de PHP con MySQL, envía esta consulta justo tras la conexión:
    mysqli_query("SET NAMES 'utf8'");
    (Para MySQLi escribe $acentos = $db->query("SET NAMES 'utf8'"); gracias Fernando)
  5. Convertir codificado a UTF-8
    Convierte todo lo que esté codificado de latin1 a UTF-8 (gracias Guillermo)
    SELECT convert(cast(convert(content using latin1) as binary) using utf8) AS content
  6. Apache
    Quita el DefaultCharset del Apache o modifícalo
  7. htmlentities
    Como última y desesperada opción, quita todos los htmlentities(); y sustitúyelo por otro parser para ‘sanitizar’ los datos.

Haciendo estos pasos se solucionará cualquier problema de codificación de caracteres. Si te ha servido este artículo, ahorra la frustración a otros programadores compartiendo el artículo en Twitter, Facebook o Google+ con los botones de abajo.

Si estás empezando con PHP/MySQL te recomiendo utilizar el código que tengo publicado aquí que es seguro, fácil de usar y funciona muy bien. También está la versión en PDO utilizando named parameters que es incluso más sencilla.

Para aprender a programar lo mejor es que te compres un libro físico para tenerlo al lado del ordenador a modo de consulta/referencia, te recomiendo sin lugar a dudas Domine PHP y MySQL, es el libro mejor recomendado que desde hace muchos años siempre tengo al alcance cuando programo y el hecho de consultarlo físicamente me ayuda a consolidar y memorizar mucho mejor los conceptos.

Y si estás buscando un framework PHP te recomiendo Fat-Free-Framework (también conocido como F3), es de código abierto y rapidísimo de aprender y utilizar.

Fotografía por Eduardo

Buscas ideas para un regalo? TrendLiker.com tiene centenares de artículos y te envía un email cuando bajan de precio en Amazon para comprar barato.

Did you enjoy this article?

Thank with a coffee ☕

Or help me out by clicking one of these buttons:

    
    

No comments yet

Follow me for cool new products and interesting findings on graphic design, web development, marketing, startups, life and humor.


/*Twitter*/ !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs"); /*Facebook (function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) {return;}js = d.createElement(s); js.id = id;js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1&appId=28624667607";fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));*/ /*Google+*/ window.___gcfg = {lang: 'en-GB'};(function() {var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;po.src = 'https://apis.google.com/js/plusone.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);})();
Airbnb 25€ discount