domingo, 2 de diciembre de 2012

Importar/exportar datos en MySql con LOAD DATA INFILE desde y hacia un fichero externo

La instrucción de MySql LOAD DATA INFILE nos permite cargar datos desde un archivo externo, básicamente se trata de leer el contenido de un fichero y volcarlo en una tabla. El comando en cuestión tiene la siguiente sintaxis básica:

LOAD DATA INFILE 'c:/archivo_datos.txt' INTO TABLE nombre_tabla;

Las opciones de las que dispone esta instrucción son numerosas y permiten adaptar el tipo de volcado a nuestras necesidades concretas. Veamos un ejemplo:

LOAD DATA INFILE 'c:/archivo_datos.txt'
INTO TABLE nombre_tabla
FIELDS TERMINATED BY ';'
ENCLOSED BY '\"'
ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'

En este caso le estamos indicando al motor de base de datos que cargue el archivo considerando que cada campo está separado por el carácter de punto y coma, también que todos los valores le llegaran entrecomillados con comillas dobles (si usamos el modificador OPTIONALLY sólo se entrecomillarán las columnas de texto y fecha), el carácter de escape es la barra invertida y cada salto de línea se indica con \r\n (Importante: Si se ha generado el fichero de texto en un sistema Windows , se tiene que usar LINES TERMINATED BY '\r\n' para leer correctamente el fichero, ya que los programas de Windows típicamente usan dos caracteres como terminadores de línea, de lo contrario bastará el signo de nueva línea '\n').

Otra cuestión a considerar y que puede llegar a producir un verdadero dolor de cabeza es el "conjunto de caracteres" y "collation" de la tabla. Aunque nuestra tabla sea utf-8 (CHARACTER SET utf8, COLLATION utf8_general_ci) los acentos y las eñes no se importarán correctamente. Para solucionar este problema debemos indicar CHARACTER SET UTF8 después del nombre de la tabla, y emplear LOCAL como parte del comando si estamos cargando datos desde nuestro propio ordenador.

LOAD DATA LOCAL INFILE 'c:/archivo_datos.txt'
INTO TABLE nombre_tabla CHARACTER SET UTF8
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '\"'
ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'

Del mismo modo podemos realizar la operación contraria, es decir, generar un archivo de texto plano con los datos de una tabla dada. Veamos un ejemplo:

SELECT * FROM nombre_tabla
INTO OUTFILE 'c:/archivo_datos.txt'
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\r\n';

De esta manera obtenemos un archivo llamado "archivo_datos.txt" con un registro por línea, cuyos valores de columna se encuentran separados por un punto y coma y los campos con valores de texto y fechas se entrecomillarán.

miércoles, 28 de noviembre de 2012

Copia de seguridad de MySql con mysqldump

Una forma bastante fácil y práctica para realizar un backup de nuestras bases de datos en Mysql es mediante el comando mysqldump que se utiliza de la siguiente forma:

mysqldump --opt --all-databases > archivo_de_copia.sql

Encontraremos mysqldump en el directorio bin de nuestra instalación de MySql. Podemos ejecutarlo desde la consola y establecer una serie de parámetros para adaptar el volcado según nuestras necesidades. En la página oficial de MySql encontramos todos estos parámetros y sus diferentes usos.

Vamos a ver como haríamos una copia de seguridad básica que incluye todas las tablas y los datos de una base de datos concreta:

mysqldump -u[usuario] -p[contraseña] base_de_datos > ruta_archivo_de_copia.sql

Para más información sobre copias de seguridad en MySql consultar:
http://dev.mysql.com/doc/refman/5.0/es/backup.html
http://dev.mysql.com/doc/refman/5.0/es/mysqldump.html

domingo, 22 de agosto de 2010

Calcular la edad a partir de la fecha de nacimiento con MySql

Haciendo uso de algunas de las funciones para el manejo de fechas de MySql, calculamos la edad de un individuo a partir de su fecha de nacimiento.

#formato de fecha yyyy-mm-dd
SELECT
   usuarioID,
   nombre,
   YEAR(FROM_DAYS(DATEDIFF(NOW(), fecha_nacimiento))) as anos,
   MONTH(FROM_DAYS(DATEDIFF(NOW(), fecha_nacimiento))) as meses,
   CONCAT(
      YEAR(FROM_DAYS(DATEDIFF(NOW(), fecha_nacimiento))), ' años, ',
      MONTH(FROM_DAYS(DATEDIFF(NOW(), fecha_nacimiento))), ' meses'
   ) AS EDAD
FROM
   usuarios
martes, 17 de agosto de 2010

Instalar Apache, PHP y MySql en Windows

Primero descargamos la última versión del servidor web Apache. Elegimos las opciones por defecto que nos ofrece el asistente de instalación. Una vez instalado accedemos a su configuración localizando el archivo httpd.conf. De momento lo único que comprobaremos es que el servidor Apache esté escuchando un puerto libre (Listen 8080). Lo lógico sería atender las solicitudes del puerto 80 que es el estándar, pero si ya está previamente instalado el servidor web Microsoft IIS (como es mi caso), Apache debe escuchar las peticiones que lleguen por el puerto 8080 para no entrar en conflicto, por lo que en este caso para comprobar que todo está OK escribimos en la barra de dirección del navegador http://localhost:8080

Descargamos la última versión de PHP, como lo vamos a usar con Apache, hacemos caso de las recomendaciones y elegimos la compilación VC6 x86 Thread Safe: "If you are using PHP with Apache 1 or Apache2 from apache.org you need to use the VC6 versions of PHP".

Copiamos el contenido del zip en C:\php

Ahora vamos a indicarle al servidor web Apache que debe utilizar PHP, para ello regresamos al archivo httpd.conf y localizamos la sección "Dynamic Shared Object (DSO) Support" y añadimos la siguiente línea:

LoadModule php5_module "c:/php/php5apache2.dll"

Importante: Si la versión de Apache es 2.2.x o superior la librería que hay que referenciar es php5apache2_2.dll

Apache 2.2.x Support: Users of Apache 2.2.x may use the documentation below except the appropriate DLL file is named php5apache2_2.dll and it only exists as of PHP 5.2.0.

Justo debajo de esta línea añadimos:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
PHPIniDir "C:/php"

Localizamos la sección DirectoryIndex y añadimos index.php como página de inicio:

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

Reiniciamos el servidor y ya debería funcionar PHP correctamente. Ahora solo queda adaptar el archivo php.ini a nuestras necesidades, habilitando los módulos o extensiones que vayamos a necesitar, no sin antes indicar la ruta donde se encuentran así:

extension_dir = "C:/php/ext/"

Por último, instalamos MySql siguiendo el asistente. La última vez que lo instalé me encontré con que no podía conectar vía mysql_connect() utilizando "localhost" como nombre del servidor ya que lanzaba el siguiente error:

Se produjo un error durante el intento de conexión ya que la parte conectada no respondió adecuadamente tras un periodo de tiempo, o bien se produjo un error en la conexión establecida ya que el host conectado no ha podido responder.

Este inconveniente se debe a la incapacidad del sistema operativo de resolver "localhost" hacia 127.0.0.1 Esto sucede tanto en Windows Vista como en Windows 7 ya que por defecto el archivo Hosts ubicado en C:/Windows/System32/drivers/etc trae la siguiente línea comentada:

#127.0.0.1     localhost

Solo hay que quitar la almohadilla y a funcionar.

lunes, 16 de agosto de 2010

MySql, PHP y la codificación utf8

Para evitar problemas con acentos, eñes, etc. y de paso maximizar la compatibilidad de nuestras páginas y bases de datos MySql con cualquier idioma y distintos conjuntos de caracteres, lo mejor es utilizar o establecer por defecto el tipo de codificación UTF-8.

La mejor opción es configurar el servidor MySql para que trabaje con codificación UTF-8 por defecto añadiendo estas líneas en el archivo my.ini localizar [mysqld].

default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'

Si te interesa profundizar en el tema de los "encodings" y mysql no te pierdas este artículo del Blog personal de Jynus.

El servidor Apache también dispone de una directiva llamada AddDefaultCharset que debemos establecer como utf-8 para que no aparezcan caracteres extraños en lugar de acentos, eñes, etc.

AddDefaultCharset utf-8

En el php.ini la directiva default_charset también tiene algo que ver en todo este galimatias de tipos de codificación y caracteres.

default_charset = "iso-8859-1"

Mediante PHP también es posible configurar el charset en el momento de usar cualquier tabla, para ello debemos especificar el siguiente código después de realizar la conexión y la selección de la BD (mysql_connect – mysql_select_db) y antes de ejecutar cualquier consulta.

mysql_query ("SET NAMES 'utf8'");

En PHP 5.2 o superior podemos también usar:

mysql_set_charset("utf8", $conn);

Una función muy práctica que sirve para ver el charset que está devolviendo MySql.

mysql_client_encoding($conn);