Dos primos luchan contra la tecnología

Aprendizaje y formación en informática profesional mediante videotutoriales

Codificación con el charset UTF-8 e internacionalización de caracteres

UTF-8(8-bit Unicode Transformation Format) es una norma de transmisión de longitud variable para caracteres codificados utilizando Unicode que nos permite representar caracteres de todo el mundo. Es una implementación de Unicode más como UTF-16 o UTF-32. En teoría nos va a permitir crear nuestras páginas web sin preocuparnos de acentos y caracteres extraños ya que todos son representados de manera estándar. Esto se consigue asignando a cada caracter un codigo único e irrepetible. De esta manera podemos por ejemplo tener un foro en el que se recojan comentarios en varios alfabetos diferentes y sean legibles por todos. También nos servirá para no tener que codificar los acentos y la ñ por sus entidades equivalentes en HTML como &xacute; o ñ sin que nos aparezcan símbolos raros en su lugar.

Para evitar errores de codificación es muy importante seguir todos estos pasos ya que si nos dejamos alguno podemos obtener resultados no deseados.

Si ya teníamos contenidos en la base de datos con otro charset como latin1 (iso-8859-1) debemos transformarlos a UTF-8. Por ejemplo se puede hacer exportando la base de datos completa y con un editor de texto cambiar la codificación a UTF-8 y volver a importar. Así podemos repasar por encima los fallos de conversión ya que algunos caracteres pueden verse extraños al convertir a UTF-8.



Apache: httpd.conf:
AddCharset UTF-8 .utf8
AddDefaultCharset UTF-8

PHP: php.ini
default_charset = "utf-8"

MySQL: my.cnf
character-set-server=utf8
default-collation=utf8_unicode_ci

phpmyadmin: config.inc.php
$cfg['DefaultLang'] = 'es-utf-8';
$cfg['Lang'] = 'es-utf-8';
$cfg['DefaultCharset'] = 'utf-8';

Paginas web:
En todas las páginas web especificar el charset en la cabecera.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Scripts de conexión a la DB:
Después de realizar la conexión, especificar el juego de caracteres
mysql_query("SET NAMES 'utf8'");

Expresiones regulares (REGEXP) en MySQL

Al crear páginas dinámicas con información almacenada en una base de datos hay que porcurar que todo el trabajo de búsqueda lo realize la base de datos. Cuando necesitamos filtrar información en base a un patrón de expresión regular es prferible incluir el patrón regexp en la consulta SQL a obtener todos los datos en bruto y filtrarlos posteriormente mediante un script. Siempre será más rápido realizar el filtrado a nivel de base datos.

La sintaxis de la consulta sería:

expresion REGEXP patrón

(more…)

Acceso a base de datos MySQL con JDBC (Java)

Para poder utilizar la base de datos MySQL desde una aplicación Java necesitamos descargar el conector para Java que ofrece MySQL en su sitio web
http://dev.mysql.com/downloads/connector/j/

Allí seleccionad la versión adecuada para vuestro servidor de base de datos.

Pongo una clase de ejemplo muy sencillo para ver cómo se realiza una consulta SQL común.

(more…)

MySQL – Charset y Collation

En MySQL vienen definidos unos valores por defecto para charset y para collation que en ocasiones puede darnos sorpresas al importar archivos SQL apareciendo caracteres extraños en lugar de los que esperábamos ver.

Por charset se entiende el juego de caraceteres que utiliza el servidor MySQL, mientras que por collation se entiende las reglas de comparación para ordenar alfabéticamente ese juego de caracteres.

En mi servidor se han definido por defecto utf-8 para charset y latin1_swedish_ci para el collation (los autores de MySQL son suecos).

Nosotros definiremos latin1(iso-8859-1) para el charset y latin1_spanish_ci para collation.

Editamos el archivo de configuración de MySQL que se suele llamar my.ini o my.cnf dependiendo del sistema operativo y añadimos los siguientes valores después de la sección [mysqld]:

character-set-server=latin1
collation-server=latin1_spanish_ci
default-character-set=latin1
default-collation=latin_spanish_ci

A continuación reiniciamos el servidor y así se habrán establecido los nuevos valores por defecto.

Para asegurarnos, especificamos los charsets en la configuración de PHP y Apache.

Editamos php.ini y modificamos la línea:

default_charset="iso-8859-1"

Editamos httpd.conf y modificamos la línea. Si comentamos la línea tomará el charset por defecto del navegador:

AddDefaultCharset ISO-8859-1

PhpMyAdmin: DROP DATABASE

Las últimas versiones de phpMyAdmin no permiten borrar las bases de datos a los usuarios normales aunque sean de su propiedad.

Para solucionar esto hay que editar el archivo de configuración de phpMyAdmin llamado normalmente config.inc.php y editar la clave $cfg['allowUserDropDatabase'] = TRUE

Con esto se mostrará la pestaña que permite borrar la base de datos y también permitirá la ejecución del comando SQL.

Importar archivos sql grandes

Al intentar cargar en una base de datos un archivo sql que pase de los 2 megas PHPMyAdmin se queda colgado o muestra error.

Opción 1 (si es para uso local, servidor de prueba):

Para evitar este problema debemos editar el archivo de configuración de PHP, es decir, php.ini.

Buscar los siguientes valores y asignarles mayor tamaño

post_max_size = 2M
upload_max_filesize = 2M

Opción 2 (si es en remoto, servidor de verdad):

  • No modificar los valores en php.ini para evitar que nos suban archivos muy grandes.
  • Subir el archivo sql por ftp.
  • Abir una consola remota ssh.
  • Ejecutar el comando:
    mysql -u usuario -p nombre_db < archivo.sql

Base de datos multiusuario

Si tenemos varios usuarios utilizando MySQL con la interfaz PHPMyAdmin debemos restringir los permisos de manera que un usuario no tenga acceso a las bases de datos de otros usuarios.

Para identificar a qué usuario pertenece una base de datos, se le antepone un prefijo que consiste en el nombre del usuario y un caracter separador delante del nombre de la base de datos de la manera: usuario_base

Para ello hacer lo siguiente:

  • Ir a "Privilegios" y crear un nuevo usuario.
  • El usuario no debe tener ningún tipo de privilegio global.
  • En "Pirvilegios específicos para la base de datos" escribimos el nombre de usuario seguido de un caracter separador como puede ser el guíon bajo "_" o el símbolo de porcentaje "%" quedando algo como usuario_. Este será el prefijo que tendrá el usuario en sus bases de datos. Pulsar en "Continuar".
  • A continuación, otorgar todos los privilengios específicos necesarios y finalizar.

Para crear una base de datos nueva, el usuario debera escribir su prefijo delante del nombre de nueva base de datos. Esta base de datos sólo podrá ser administrada por ese usuario y por el root, naturalmente.