Apendice D Husos horarios

Este apéndice es una traducción del manual de MySQL.

Antes de MySQL 4.1.3, se puede cambiar el huso horario para el servidor con la opción --timezone=timezone_name de mysqld_safe. También se puede cambiar mediante la variable de entorno TZ antes de arrancar mysqld.

Los valores permitidos para --timezone o TZ son dependientes del sistema. Hay que consultar la documentación del sistema operativo para ver qué valores son válidos.

A partir de MySQL 4.1.3, el servidor mantiene ciertos valores de huso horario:

  • El huso horario del sistema. Cuando el servidor arranca, intenta determinar el huso horario del ordenador cliente y lo usa para asignar el valor de la variable de sistema system_time_zone.
  • El huso horario actual del servidor. La variable global de sistema time_zone system indica el huso horario del servidor actual en el que se está operando. El valor iniciale es 'SYSTEM', que indica que el huso horario del servidor es wl mismo que el del sistema. El valor inicial puede ser especificado explícitamente con la opción --default-time-zone=timezone. Si se posee el privilegio SUPER, se puede asignar el valor global durante la ejecución con la sentencia:
    mysql> SET GLOBAL time_zone = timezone;
  • Husos horarios por conexión. Cada cliente que se conecta tiene su propio huso horario asignado, dado por la variable de sesión time_zone. Inicialmente su valor es el mismo que el de la variable global time_zone, pero se puede modificar con esta sentencia:
    mysql> SET time_zone = timezone;

Los valores actuales de los husos horarios global y por conexión pueden ser recuperados de este modo:

mysql> SELECT @@global.time_zone, @@session.time_zone;

Los valores timezone pueden ser dados como cadenas que indiquen un desplazamiento a partir de UTC, como por ejemplo '+10:00' o '-6:00'. Si las tablas de tiempo relacionadas con husos horarios de la base de datos mysql han sido creados y asignados, se puedem usar también nombres de husos horarios, como por ejemplo 'Europe/Helsinki', 'US/Eastern' o 'MET'. El valor 'SYSTEM' indica que el huso horario debe ser el mismo que el del systema. Los nombres de husos horarios no son sensibles al tipo de carácter.

El proceso de instalación de MySQL crea las tablas de husos horarios en la base de datos mysql, pero no las carga. Esto se debe hacer de forma manual. (Si se está actualizando a MySQL 4.1.3 o superior desde una versión anterior, se deben crear las tablas mediante una actualización de la base de datos mysql.

Si el sistema tiene su propia base de datos de información horaria (el conjunto de ficheros que describen los husos horarios), se debe usar el programa mysql_tzinfo_to_sql para llenar las tablas de husos horarios. Ejemplos de tales sistemas son Linux, FreeBSD, Sun Solaris y Mac OS X. Una localización probable de estos ficheros es el directorio '/usr/share/zoneinfo'. Si el sistema no tiene una base de datos de husos horarios, se puede usar el paquete descargable descrito más abajo.

El programa mysql_tzinfo_to_sql se usa para cargar los valores de las tablas de husos horarios. En la línea de comandos, hay que pasar el nombre de la ruta del directorio con la información de husos horarios a mysql_tzinfo_to_sql y enviar la salida al programa mysql. Por ejemplo:

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

mysql_tzinfo_to_sql lee los ficheros de husos horarios del sistema y genera sentencias SQL a partir de ellos. mysql procesa esas sentencias para cargar las tablas de husos horarios.

mysql_tzinfo_to_sql también se usa para cargar un único fichero de huso horario, y para generar información adicional.

Para cargar un fichero tz_file que corresponda a un huso horario llamado tz_name, hay que invocar a mysql_tzinfo_to_sql de este modo:

shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql

Si el huso horario precisa tener en cuenta intervalos de segundos, hay que inicializar la información de intervalo de segundos de este modo, donde tz_file e el nombre del fichero:

shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql

Si el sistema no tiene base de datos de husos horarios (por ejemplo, Windows o HP-UX), se puede usar el paquete de tablas de husos horarios prediseñadas que está disponible para su descarga en http://dev.mysql.com/downloads/timezones.html. Este paquete contiene los ficheros '.frm', '.MYD' y '.MYI' para las tablas de husos horarios MyISAM. Estas tablas deben pertenecer a la base de datos mysql, de modo que deben colocarse esos ficheros en el subdirectirio 'mysql' de directorio de datos del servidor MySQL. El servidor debe ser detenido mientras se hace esto.

¡Cuidado! no usar el paquete descargable si el sistema tiene una base de datos de husos horarios. Usar la utilidad mysql_tzinfo_to_sql en su lugar. En caso contrario, se puede provocar una diferencia en la manipulación de tiempos entre MySQL y otras aplicaciones del sistema.