Imaginemos una aplicación con la base de datos de mysql. En ella editamos información por ejemplo, de usuarios.
Todo es bonito y precioso.
Hasta! que decides exportar información a csv, hacer un volcado de datos y exportarlo a otra base de datos… etc.
¿Por qué? ¡Se ven mal los acentos, ñññññ y muchos caracteres!
Si estás en este caso, es que tienes mezclados los charset. Familiarizate con COLLATION y CHARSET.
Es mejor que utilices por compatibilidad UTF8.
Mysql por defecto crea collation a ‘latin1_swedish_ci’. Para arreglar los datos deberás hacer lo siguiente:
Si lo haces desde consola:
- Modificar la tabla
ALTER TABLE `caracteristicas_subtipos`
COLLATE=’utf8_general_ci';
- Exportar los datos por medio de inserts Hacer truncate de la tabla.
- Mediante volcado mysqldump -p –default-character-set=utf8 base_de_datos tabla_a_modificar > tabla_a_modificar.sql
- Volcar los datos.
- Mediante mysql -p base_de_datos < tabla_a_modificar.sql
Si lo haces desde una herramienta de mysql:
Cambia sólo la forma de obtener los datos. Exporta los datos a INSERTS. Haz un truncate de la tabla. Antes de volcar los inserts pon la sentencia:
set names utf8;
FAQ:
Se puede hacer aplicado a todo un esquema?: No, tendrás que hacerlo tabla por tabla. Si alguien lo ha conseguido que lo comente!! sería un gran descubrimiento!
Agradecimientos:
A @rcasas que me enseñó estas cosas tan chulas.
**************
Problemas html acentos y eñes: charset UTF-8 / ISO-8859-1
La codificación de las páginas web (charset) es un problema recurrente para los webmasters, porque:
- Depende del editor en que se haya hecho la web, si en el trabajamos por defecto en UTF-8 o ISO-8859-1. Si el archivo original estaba escrito en ISO-8859-1 y lo editamos en UTF-8, veremos los caracteres especiales mal codificados. Si guardamos ese archivo tal cual, estaremos corrompiendo la codificación original (se guardará mal, con UTF-8). Y viceversa.
- Depende de la configuración del Apache.
- Depende de si hay un archivo oculto .htaccess en el directorio raíz que sirve nuestra web (httpdocs, public_html o similar)
- Depende de si se especifica en las etiquetas META de los HTML resultantes.
- Depende de si se especifica en la cabecera de un archivo PHP.
- Depende del charset elegido en la base de datos (si se usa una base de datos para mostrar contenidos con un CMS, tal como Joomla, Drupal, phpNuke, o una aplicación propia que sea dinámica).
Por lo general, si nunca tienen que aparecer acentos o eñes en nuestra web, nos es indiferente la codificación (aunque pueden haber otros símbolos que nos fastidien). Aunque si nuestra web está en español, lo más normal es que coloquemos acentos y eñes. Para ello, el estándar HTML está preparado para colocar todos los símbolos y acentos que nos sean necesarios, codificándolos. Así, para los acentos y eñes, deberíamos colocar:
á -> á
é -> é
í -> í
ó -> ó
ú -> ú
ñ -> ñ
Variantes valenciano-catalán-balear para acentos abiertos:
à -> à
è -> è
ò -> ò
De este modo, veremos todos caracteres correctamente, independientemente del charset.
Sin embargo, puede ser tedioso para ciertos contenidos tener que ir traduciendo nosotros manualmente los caracteres. Es en estos casos donde vale la pena perder un poco de tiempo para ajustar las distintas configuraciones.
Primero, habría que determinar en nuestra web con las etiquetas META que nuestra web debe servirse en la codificación que nosotros elijamos. O sea, dentro de :
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
o bien
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
Si seguimos con el problema, Segundo, ver si por defecto tiene el servidor (apache) algún charset predefinido. Si es así, se ignorarán las etiquetas META del html.
En un servidor Linux, el archivo charset está en:
/etc/apache2/conf.d/charset
también puede cambiarse en el archivo httpd.conf
Debería aparecer sólo "AddDefaultCharset off", para que haga caso de las etiquetas META (lo ideal). Podemos poner, por ejemplo, "AddDefaultCharset UTF-8", y así apache siempre emitirá las webs en UTF-8. El problema es que esto afecta a todo el servidor, y si luego tenemos alguna web que vaya a usar otra codificación tendremos un problema. Por eso, lo ideal es que esté a Off y que cada web defina cómo quiere mostrarse.
Pero puede darse el caso de que nosotros no seamos los administradores del servidor y sólo tengamos un Plesk, y no podamos acceder al archivo charset por encontrarse fuera de nuestro rango de permisos. Podemos, entonces, pedirle al administrador del servidor que coloque el parámetro anterior a Off, o bien...
Alternativa 1: Colocar un archivo .htaccess en el directorio raíz de la web
Los .htaccess son archivos de configuración que sobreescriben algunas configuraciones del apache sólo para determinados casos. Hay que tener en cuenta que estos archivos:
- Pueden funcionar total o parcialmente, dependiendo de la configuración del servidor (cuestión de seguridad).
- Son archivos ocultos, por lo que para verlos tenéis que tener habilitada la función "ver archivos ocultos" en vuestro programa que acceda por ftp.
Este archivo .htaccess debería tener al menos una línea de este tipo
AddDefaultCharset utf-8
Alternativa 2: Colocar una directiva en php que fuerce a mostrarse en la codificación deseada
Esto es, sólo sirve si el archivo tiene extensión ".php". Recordemos que el html y el php pueden convivir en el mismo fichero, con lo que si renombramos un ".html" a ".php", el resutlado es exactamente el mismo (si tenemos instalado el php en nuestro servidor, claro está).
En la primera línea del archivo que deseemos indicarle la codificación (o lo antes posible) deberíais colocar la siguiente cabecera:
<?php
header('Content-Type: text/html; charset=UTF-8'); ?>
Para todos los casos donde funcione el comando "AddCharset"
- Puede especificarse el charset según la extensión del archivo. Si, por ejemplo, queremos que los ".php" sean UTF-8 y los ".html" sean ISO, podemos colocar estas dos instrucciones seguidas:
AddCharset UTF-8 .php
AddCharset ISO-8859-1 .html
‹ Plesk 9: Logs de error y accesos del dominio: "remove_files failed"upCómo ajustar un diseño web html a explorer+firefox+opera+chrome ›
**************
Distinguir acentos, mayúsculas y minúsculas en MySQL
Publicado: 02/02/2011 en base de datos, MySQL
Etiquetas:acentos, base de datos, mayúsculas, minúsculas, MySQL, query, tilde
En esta ocasión vamos a hablar sobre cómo generar una sencilla query de selección de datos en una base de datos MySQL, cuyo charset ha sido establecido como utf8_general_ci pero necesitamos distinguir entre datos con acentos y datos sin acentos, y yendo un poco más allá, si fuera posible, que no distinga entre palabras que empiecen con mayúsculas o minúsculas pero sí los acentos. Veamos cómo podríamos implementarlo.
Definición de nuestro problema
Expliquemos un poco mejor cuál es nuestro problema. Tenemos una base de datos MySQL en la que tenemos a su vez una tabla, por ejemplo, “usuarios”, con varios campos: id, nombre y apellido. Esta base de datos fue creada con un charset utf8_general_ci. Pero, ¿qué significa esto? Obviamente, utf8 es el charset que nuestra base de datos va a gestionar. En segundo lugar, “general” indica que no utilizaremos el juego de caracteres propio de un idioma en concreto, (podríamos tener “utf8_spanish_ci”, para el juego de carácteres propios del español), sino el utf8 de forma genérica. En último lugar, “ci” significa “Case Insensitive”, de forma que en nuestras búsquedas, el motor de MySQL no hará distinciones entre “MAYÚSCULA”, “Mayúscula” o “mayúscula”. Lo que no es tan conocido es que el ser Case Insensitive también implica que no distinga los acentos del español, de forma que tampoco hace distinciones entre “mayúscula” o “mayuscula”.
De forma que si tenemos 3 registros en nuestra tabla usuarios, en los cuales tenemos los siguientes valores para el campo nombre: “José”, “Jose” y “JOSÉ”, y ejecutamos la siguiente query:
SELECT * FROM `usuarios` WHERE `nombre` = 'jose'
Ésta nos devolverá los 3 registros de nuestra base de datos, sin distinciones.
Distinguir acentos, mayúsculas y minúsculas en MySQL
Para poder distinguir acentos, mayúsculas y minúsculas en nuestras búsquedas en una base de datos MySQL con charset utf8_general_ci necesitamos indicarle al motor MySQL que en ésta búsqueda en concreto no aplique el charset utf8_general_ci, sino que utilice otro, el conocido como utf8_bin, y para ello hemos de utilizar la palabra reservadaCOLLATE. Con este charset le estamos indicando a MySQL que la comparación en la búsqueda la haga a nivel binario, con lo cual ahora sí podrá distinguir entre palabras con acentos y sin acentos, mayúsculas y minúsculas dado que (obviamente) un carácter con acento es bianariamente distinto a uno sin acento así como las mayúsculas. De forma que nuestra query anterior, para que distinga acentos, sería algo así:
SELECT * FROM `usuarios` WHERE `nombre` = 'josé' COLLATE utf8_bin
Esta query nos devolvería un registro nulo, dado que no existe exactamente “josé” en nuestra base datos. Para poder obtener un valor deberíamos ejecutar la misma query pero comparando con el valor “José” o “JOSÉ”, dado que con el COLLATE utf8_bin “josé” <> “jose” <> “José” <> “JOSÉ” etc.
Pero resulta que necesitamos que distinga acentos pero que no tenga en cuenta mayúsculas o minúsculas. ¿Cómo podemos solucionarlo?
Distinguir acentos, sin distinguir mayúsculas o minúsculas en MySQL
Para que MySQL pueda distinguir los acentos pero no las mayúsculas o minúsculas, no tenemos que hacer nada especial. Simplemente lo que haremos será convertir a todos los caracteres en mayúscula del valor almacenado en el campo nombre y convertir a todos los caracteres en mayúsculas del valor del parámetro a comparar, de forma que internamente en el momento de la búsqueda no existan minúsculas y así poder comparar con seguridad. Para ello utilizaremos la palabra reservada UPPER de MySQL. De forma, que nuestra query anterior, para que no distinga mayúsculas y minúsculas pero sí acentos, sería la siguiente:
SELECT * FROM `usuarios` WHERE UPPER(`nombre`) = UPPER('josé) COLLATE utf8_bin
Esta query nos devolvería como resultado los nombres “José” y “JOSÉ”, dado que no hacemos distinciones de mayúsculas, tal y como queríamos conseguir.