5.9. Uso internacional y localización de MySQL

MySQL 5.0

5.9. Uso internacional y localización de MySQL

Esta sección explica como configurar el servidor para utilizar diferentes juegos de carácteres. También explica como establecer la zona horaria del servidor, y activar el soporte para zonas horarias por conexión.

5.9.1. El conjunto de caracteres utilizado para datos y ordenación

Por defecto, MySQL utiliza el juego de carácteres ISO-8859-1 (Latin1), con ordenación de acuerdo a las reglas Suecas/Finlandesas. Estos valores por defecto son aplicables a los Estados Unidos y la mayoría de Europa occidental.

Todas las distribuciones binarias de MySQL se compilan con la opción . Esto añade código a todos los programas estándard que les permite manejar el juego de carácteres y todos los juegos de carácteres multi-byte desde el binario. Otros juegos de carácteres se cargan desde un archivo de definición, cuando sea necesario.

El juego de carácteres determina qué carácteres se permiten en los nombres. También determina como las cadenas de carácteres se ordenan mediante las cláusulas y de la sentencia .

Puede cambiar el juego de carácteres con la opción cuando inicie el servidor. Los juegos de carácteres disponibles dependen de las opciones y | complex | all | none del comando configure, y los archivos de configuración de juegos de carácteres enumerados en . Consulte Sección 2.8.2, “Opciones típicas de configure.

En MySQL 5.0, también puede cambiar la colación del juego de carácteres con la opción cuando inicie el servidor. La colación debe ser alguna que sea válida para el juego de carácteres por defecto. (Utilice la sentencia para determinar qué colaciones están disponibles para cada juego de carácteres.) Consulte Sección 2.8.2, “Opciones típicas de configure.

Si usted cambia el juego de carácteres cuando ejecuta MySQL, esto también podría cambiar la ordenación. En consecuencia, debe ejecutar myisamchk -r -q --set-character-set= en todas sus tablas, o sus índices podrían no estar ordenados correctamente.

Cuando un cliente se conecta a un servidor MySQL, el servidor indica al cliente cúal es el juego de carácteres por defecto del servidor. El cliente se adapta entonces para utilizar este juego de carácteres en su conexión.

Debería utilizar cuando escape cadenas de carácteres para una sentencia SQL. es idéntica a la antigua función , excepto que toma el identificador de conexión como primer parámetro para que pueda tenerse en cuenta el juego de carácteres apropiado cuando se escapan carácteres.

Si el cliente ha sido compilado con rutas diferentes a las del servidor que está instalado, y el usuario que configuró MySQL no incluyó todos los juegos de carácteres en el binario de MySQL, debe indicarle al cliente dónde puede encontrar los juegos de carácteres adicionales que necesita si el servidor ejecuta un juego de carácteres diferente.

Puede hacerlo especificando la opción para indicar la ruta al directorio donde se encuentra los juegos de carácteres dinámicos de MySQL. Por ejemplo, podría poner lo siguiente en un archivo de opciones:

[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets

Puede forzar a que el cliente utilice un juego de carácteres específico de la siguiente manera:

[client]
default-character-set=

De todas formas, normalmente, esto no es necesario.

5.9.1.1. Usar el conjunto de caracteres alemán

En MySQL 5.0, el juego de carácteres y la colación se especifican separadamente. Esto significa que si quiere la ordenación alemana, debería seleccionar el juego de carácteres y las colaciones o . Por ejemplo, para iniciar el servidor con la colación , utilice las opciones y .

Para obtener más información sobre las diferencias entre estas dos colaciones, consulte Sección 10.10.2, “Conjuntos de caracteres de Europa occidental”.

5.9.2. Escoger el idioma de los mensajes de error

Por defecto, mysqld produce mensajes de error en inglés, pero también puede producirlos en cualquiera de estos otros idiomas: alemán, checo, danés, eslovaco, español, estonio, francés, griego, holandés, húngaro, italiano, japonés, koreano, noruego, polaco, portugués, rumano, ruso o sueco.

Para iniciar mysqld con un idioma particular para los mensajes de error, utilice la opción o . El valor de la opción puede ser el nombre de un idioma o la ruta completa al archivo de mensajes de error. Por ejemplo:

shell> mysqld --language=swedish

O:

shell> mysqld --language=/usr/local/share/swedish

El nombre del idioma debe ser especificado en minúsculas.

Los archivos de idiomas están almacenados (por defecto) en el directorio bajo el directorio base de MySQL.

Para cambiar el archivo de mensajes de error, debería editar el archivo , y después ejecutar el siguiente comando para generar el archivo :

shell> comp_err errmsg.txt errmsg.sys

Si actualiza a una versión más nueva de MySQL, recuerde repetir los cambios con el nuevo archivo .

5.9.3. Añadir un conjunto de caracteres nuevo

Esta sección explica el procedimiento para añadir nuevos juegos de carácteres a MySQL. Debe tener una distribución de código fuente de MySQL para utilizar estas instrucciones.

Para escoger el método apropiado, decida si el juego de carácteres es simple o complejo:

  • Si el juego de carácteres no necesita rutinas especiales de colación para ordenar, y no necesita soporte para cáracteres multi-byte, es simple.

  • Si necesita cualquiera de esas características, es complejo.

Por ejemplo, y son juegos de carácteres simples, mientras que y son complejos.

En los siguientes procedimientos, el nombre de su juego de carácteres está representado por .

Para un juego de carácteres simple, haga lo siguiente:

  1. Añada al final del archivo . Asígnele un número único.

  2. Cree el archivo .conf. (puede utilizar una copia de en la que basarse.)

    La sintaxis de este archivo es muy simple:

    • Los comentarios comienzan con un carácter'' y continuan hasta el final de la línea.

    • Las palabras están separadas por un número de espacios arbitrario.

    • Al definir el juego de carácteres, cada palabra debe ser un número en formato hexadecimal.

    • El array ocupa las primeras 257 palabras. Los arrays , y ocupan 256 cada uno después de eso.

    Consulte Sección 5.9.4, “Los vectores de definición de caracteres”.

  3. Añada el nombre del juego de carácteres a las listas y en .

  4. Reconfigurar, recompilar, y comprobar.

Para un juego de carácteres complicado, haga lo siguiente:

  1. Cree el archivo .c en la distribución de código fuente MySQL.

  2. Añada al final del archivo . Asígnele un número único.

  3. Mira uno de los archivos existentes (por ejemplo ) para ver qué necesita definir. Tenga en cuenta que los arrays del archivo deben tener nombres como , , y etc. Estos corresponden a los arrays para un juego de carácteres simple. Consulte Sección 5.9.4, “Los vectores de definición de caracteres”.

  4. Cerca del inicio del archivo, ponga un comentario especial como este:

    /*
     * This comment is parsed by configure to create ctype.c,
     * so don't change it unless you know what you are doing.
     *
     * .configure. number_=
     * .configure. strxfrm_multiply_=
     * .configure. mbmaxlen_=
     */
    

    El programa configure utiliza este comentario para incluir el juego de carácteres en la librería MySQL automaticamente.

    Las líneas y se explican en las siguientes secciones. Necesita incluirlas sólo si necesita las funciones de colación de cadenas de carácteres o de carácteres multi-bye, respectivamente.

  5. Debería crear entonces alguna de las siguientes funciones:

    • ()

    • ()

    • ()

    • ()

    Consulte Sección 5.9.5, “Soporte para colación de cadenas de caracteres”.

  6. Añada el nombre del juego de carácteres a las listas y en .

  7. Reconfigure, recompile, y compruebe.

El archivo incluye instrucciones adicionales.

Si quiere que el juego de carácteres sea incluido en la distribución MySQL, envíe un parche a la lista de correo de MySQL. Consulte Sección 1.6.1.1, “Las listas de correo de MySQL”.

5.9.4. Los vectores de definición de caracteres

y son arrays simples que contienen los carácteres en minúsucula y mayúscula correspondientes a cada miembro del juego de carácteres. Por ejemplo:

to_lower['A'] debería contener 'a'
to_upper['a'] debería contener 'A'

es un mapa indicando cómo deberían ser ordenados los carácteres para comparación y propósitos de ordenación. Frecuentemente (pero no en todos los juegos de carácteres) este es idéntico a , lo que significa que la ordenación es independiente de la capitalización. MySQL ordena carácteres basándose en los valores de los elementos de . Para reglas de ordenación más complicadas, consulte la explicación de colación de cadena de carácteres en Sección 5.9.5, “Soporte para colación de cadenas de caracteres”.

es un array de valores binarios, con un elemento para cada carácter. (Tenga en cuenta que , , y son idexados por valor del carácter, pero es indexado por el valor del carácter + 1. Esto es una convención antigua heredada para poder gestionar .)

Puede entontrar las siguientes definiciones de máscaras de bits en :

#define _U      01      /* Uppercase */
#define _L      02      /* Lowercase */
#define _N      04      /* Numeral (digit) */
#define _S      010     /* Spacing character */
#define _P      020     /* Punctuation */
#define _C      040     /* Control character */
#define _B      0100    /* Blank */
#define _X      0200    /* heXadecimal digit */

El valor de para cada carácter debería ser la unión de los valors de máscara aplicables que describan al carácter. Por ejemplo, es un carácter en mayúsculas () y también es un dígito hexadecimal (), así que debería tener el valor:

_U + _X = 01 + 0200 = 0201

5.9.5. Soporte para colación de cadenas de caracteres

Si las reglas de ordenación para su lenguaje son demasiado complejas para ser gestionadas con la sencilla tabla , necesita utilizar las funciones de colación de cadenas de carácteres.

La mejor documentación para este propósito son los juegos de carácteres existentes. Mire los juegos de carácteres , , , , y en busca de ejemplos.

Debe especificar el valor = en el comentario especial al principio del archivo. debería tener el máximo ratio en que pueda crecer las cadenas de carácteres durante (debe ser un entero positivo).

5.9.6. Soporte de caracteres multi-byte

Si quiere añadir soporte para un juego de carácteres nuevo que incluye carácteres multi-byte, necesita utilizar las funciones de carácter multi-byte.

La mejor documentación para este propósito son los juegos de carácteres existentes. Mire los juegos de carácteres , , , , y para encontrar ejemplos. Estos se encuentran en el archivo .c del directorio .

Debe especificar el valor de = en el comentario especial al inicio del archivo fuente. debería tener el tamaño en bytes del carácter más grande en el juego.

5.9.7. Problemas con conjuntos de caracteres

Si trata de utilizar un juego de carácteres que no está compilado en el binario, podría encontrarse con los siguientes problemas:

  • Su programa tiene la ruta incorrecta de almacenamiento de los juegos de carácteres. (Por defecto ). Esto puede arreglarse utilizando la opción para ejecutar el programa en cuestión.

  • El juego de carácteres es un juego multi-byte que no puede cargarse dinámicamente. En este caso, debe recompilar el programa con soporte para el juego de carácteres.

  • El juego de carácteres es un juego de carácteres dinámico, pero no tiene un fichero de configuración para él. En este caso, debería instalar el archivo de configuración de una nuevo distribución MySQL.

  • Si su archivo no contiene el nombre del juego de carácteres, su programa mostrará el siguiente mensaje de error:

    ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf'
    not found (Errcode: 2)
    

    En este caso, debería obtener un nuevo archivo o bien añadir el nombre manualmente de cualquier juego de carácteres que falte en el archivo actual.

Para las tablas , puede comprobar el nombre del juego de carácteres y el número de una tabla con myisamchk -dvv .

5.9.8. Soporte de zonas horarias en el servidor MySQL

En MySQL 5.0, el servidor mantiene varios ajustos de zonas horarias:

  • La zona horaria del sistema. Cuando el servidor se inicia, intenta determinar la zona horaria de la máquina que lo aloja y lo utiliza para establecer la variable de sistema .

  • La zona horaria del servidor. La variable global del sistema indica la zona horaria en que el servidor está operando actualmente. El valor inicial es , que indica que la zona horaria del servidor es la misma que la del sistema. El valor inicial puede ser especificado explícitamente con la opción . Si tiene el privilegio , puede establecer el valor global durante la ejecución, con esta sentencia:

    mysql> SET GLOBAL time_zone = ;
    
  • Zonas horarias por conexión. Cada cliente que se conecta tiene su propio ajuste de zona horaria, otorgado por la variable de sesión . Inicialmente esta es la misma que la variable global , pero puede reestablecerse con esta sentencia:

    mysql> SET time_zone = ;
    

Los valores actuales de las zonas horarias globales y por conexión pueden consultarse así:

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

Los valores de pueden darse como cadenas de carácteres indicando una variación con respecto a UTC, como por ejemplo o . Si las tablas relativas a las zonas horarias han sido creadas y rellenadas, también puede utilizar zonas horarias por su nombre, como , , o . El valor indica que la zona horaria debería ser la misma que la del sistema. Los nombres de zonas horarias no distinguen capitalización (mayúsculas/minúsculas).

El procedimiento de instalación de MySQL crea las tablas de zonas horarias en la base de datos , pero no las carga. Debe hacerlo usted manualmente. (Si está actualizando a MySQL 4.1.3 o superior desde una versión anterior, debe crear las tablas actualizando su base de datos . Utilice las instrucciones que puede encontrar en Sección 2.10.2, “Aumentar la versión de las tablas de privilegios”.)

Si su sistema tiene su propia base de datos de información de zonas (el conjunto de archivos que describen zonas horarias), debería utilizar el programa mysql_tzinfo_to_sql para rellenar las tablas de zonas horarias. Ejemplos de esos sistemas son algunos como Linux, FreeBSD, Sun Solaris, y Mac OS X. Una localización probable para estos ficheros es el directorio . Si su sistema no tiene una base de datos de información de zonas, puede utilizar un paquete descargable descrito más adelante en esta sección.

El programa mysql_tzinfo_to_sql se utiliza para cargar las tablas de zonas horarias. En la línea de comandos, pase la ruta del directorio de los archivos de información de zonas a mysql_tzinfo_to_sql y envíe 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 archivos de zona horaria de su sistema y genera sentencias SQL a partir de ellos. mysql procesa esas sentencias y las carga en las tablas de zona horaria.

mysql_tzinfo_to_sql también puede utilizarse para cargar un solo archivo de zona horaria.

Para cargar un solo archivo de zona horaria que corresponde a una zona horaria , invoque a mysql_tzinfo_to_sql de esta manera:

shell> mysql_tzinfo_to_sql   | mysql -u root mysql

Si su zona horaria necesita tener en cuenta segundos de diferencia, inicialice la información sobre segundos de diferencia de esta manera, donde es el nombre de su archivo de zona horaria:

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

Si su sistema no tiene una base de datos de información de zonas (por ejemplo, Windows o HP-UX), puede utilizar el paquete preconfigurado de tablas de zonas horarias que está disponible en http://dev.mysql.com/downloads/timezones.html. Este paquete contiene los archivos , , y para las tablas de zonas horarias . Estas tablas deben pertenecer a la base de datos , así que debe depositar los archivos en el subdirectorio de su directorio de datos de MySQL. Debería apagar el servidor mientras hace esto.

¡Cuidado! Por favor, no utilice el paquete descargable si su sistema ya tiene una base de datos de información de zonas. Utilice en cambio la utilidad mysql_tzinfo_to_sql. Si no es así, podría causar una diferencia en el manejo de fechas entre MySQL y otras aplicaciones de su sistema.

Para información sobre los ajustes de zonas horarias en configuraciones de replicación consulte Sección 6.7, “Características de la replicación y problemas conocidos”.