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.
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 --with-extra-charsets=complex
. Esto
añade código a todos los programas estándard que les permite
manejar el juego de carácteres latin1
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 ORDER
BY
y GROUP BY
de la sentencia
SELECT
.
Puede cambiar el juego de carácteres con la opción
--default-character-set
cuando inicie el
servidor. Los juegos de carácteres disponibles dependen de las
opciones
--with-charset=
charset
y
--with-extra-charsets=
list-of-charsets
| complex | all | none del comando
configure, y los archivos de configuración
de juegos de carácteres enumerados en
SHAREDIR/charsets/Index
. 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
--default-collation
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
SHOW COLLATION
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=charset
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 mysql_real_escape_string()
cuando escape cadenas de carácteres para una sentencia SQL.
mysql_real_escape_string()
es idéntica a la
antigua función mysql_escape_string()
,
excepto que toma el identificador de conexión
MYSQL
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
--character-sets-dir
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=charset
De todas formas, normalmente, esto no es necesario.
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 latin1
y las colaciones
latin1_german1_ci
o
latin1_german2_ci
. Por ejemplo, para
iniciar el servidor con la colación
latin1_german1_ci
, utilice las opciones
--character-set-server=latin1
y
--collation-server=latin1_german1_ci
.
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”.
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
--language
o -L
. 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
share/
LANGUAGE
bajo el directorio base de MySQL.
Para cambiar el archivo de mensajes de error, debería editar el
archivo errmsg.txt
, y después ejecutar el
siguiente comando para generar el archivo
errmsg.sys
:
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
errmsg.txt
.
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, latin1
y
danish
son juegos de carácteres simples,
mientras que big5
y czech
son complejos.
En los siguientes procedimientos, el nombre de su juego de
carácteres está representado por
MYSET
.
Para un juego de carácteres simple, haga lo siguiente:
-
Añada
MYSET
al final del archivosql/share/charsets/Index
. Asígnele un número único. -
Cree el archivo
sql/share/charsets/
MYSET
.conf. (puede utilizar una copia desql/share/charsets/latin1.conf
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
ctype
ocupa las primeras 257 palabras. Los arraysto_lower[]
,to_upper[]
ysort_order[]
ocupan 256 cada uno después de eso.
Consulte Sección 5.9.4, “Los vectores de definición de caracteres”.
-
-
Añada el nombre del juego de carácteres a las listas
CHARSETS_AVAILABLE
yCOMPILED_CHARSETS
enconfigure.in
. -
Reconfigurar, recompilar, y comprobar.
Para un juego de carácteres complicado, haga lo siguiente:
-
Cree el archivo
strings/ctype-
MYSET
.c en la distribución de código fuente MySQL. -
Añada
MYSET
al final del archivosql/share/charsets/Index
. Asígnele un número único. -
Mira uno de los archivos
ctype-*.c
existentes (por ejemplostrings/ctype-big5.c
) para ver qué necesita definir. Tenga en cuenta que los arrays del archivo deben tener nombres comoctype_
MYSET
,to_lower_
MYSET
, 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”. -
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_
MYSET
=MYNUMBER
* .configure. strxfrm_multiply_MYSET
=N
* .configure. mbmaxlen_MYSET
=N
*/El programa configure utiliza este comentario para incluir el juego de carácteres en la librería MySQL automaticamente.
Las líneas
strxfrm_multiply
ymbmaxlen
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. -
Debería crear entonces alguna de las siguientes funciones:
-
my_strncoll_
MYSET
() -
my_strcoll_
MYSET
() -
my_strxfrm_
MYSET
() -
my_like_range_
MYSET
()
Consulte Sección 5.9.5, “Soporte para colación de cadenas de caracteres”.
-
-
Añada el nombre del juego de carácteres a las listas
CHARSETS_AVAILABLE
yCOMPILED_CHARSETS
enconfigure.in
. -
Reconfigure, recompile, y compruebe.
El archivo sql/share/charsets/README
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
internals
de MySQL. Consulte
Sección 1.6.1.1, “Las listas de correo de MySQL”.
to_lower[]
y to_upper[]
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'
sort_order[]
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
to_upper[]
, 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
sort_order[]
. 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”.
ctype[]
es un array de valores binarios, con
un elemento para cada carácter. (Tenga en cuenta que
to_lower[]
, to_upper[]
, y
sort_order[]
son idexados por valor del
carácter, pero ctype[]
es indexado por el
valor del carácter + 1. Esto es una convención antigua
heredada para poder gestionar EOF
.)
Puede entontrar las siguientes definiciones de máscaras de bits
en m_ctype.h
:
#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 ctype[]
para cada carácter
debería ser la unión de los valors de máscara aplicables que
describan al carácter. Por ejemplo, 'A'
es
un carácter en mayúsculas (_U
) y también
es un dígito hexadecimal (_X
), así que
ctype['A'+1]
debería tener el valor:
_U + _X = 01 + 0200 = 0201
Si las reglas de ordenación para su lenguaje son demasiado
complejas para ser gestionadas con la sencilla tabla
sort_order[]
, 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
big5
, czech
,
gbk
, sjis
, y
tis160
en busca de ejemplos.
Debe especificar el valor
strxfrm_multiply_
MYSET
=N
en el comentario especial al principio del archivo.
N
debería tener el máximo ratio en
que pueda crecer las cadenas de carácteres durante
my_strxfrm_
MYSET
(debe ser un entero positivo).
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
euc_kr
, gb2312
,
gbk
, sjis
, y
ujis
para encontrar ejemplos. Estos se
encuentran en el archivo
ctype-
charset
.c
del directorio strings
.
Debe especificar el valor de
mbmaxlen_
MYSET
=N
en el comentario especial al inicio del archivo fuente.
N
debería tener el tamaño en bytes
del carácter más grande en el juego.
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
/usr/local/mysql/share/mysql/charsets
). Esto puede arreglarse utilizando la opción--character-sets-dir
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
Index
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
Index
o bien añadir el nombre manualmente de cualquier juego de carácteres que falte en el archivo actual.
Para las tablas MyISAM
, puede comprobar el
nombre del juego de carácteres y el número de una tabla con
myisamchk -dvv
tbl_name
.
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
system_time_zone
. -
La zona horaria del servidor. La variable global del sistema
time_zone
indica la zona horaria en que el servidor está operando actualmente. El valor inicial es'SYSTEM'
, 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--default-time-zone=
timezone
. Si tiene el privilegioSUPER
, puede establecer el valor global durante la ejecución, con esta sentencia:mysql> SET GLOBAL time_zone =
timezone
; -
Zonas horarias por conexión. Cada cliente que se conecta tiene su propio ajuste de zona horaria, otorgado por la variable de sesión
time_zone
. Inicialmente esta es la misma que la variable globaltime_zone
, pero puede reestablecerse con esta sentencia:mysql> SET time_zone =
timezone
;
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 timezone
pueden darse
como cadenas de carácteres indicando una variación con
respecto a UTC, como por ejemplo '+10:00'
o
'-6:00'
. Si las tablas relativas a las zonas
horarias han sido creadas y rellenadas, también puede utilizar
zonas horarias por su nombre, como
'Europe/Helsinki'
,
'US/Eastern'
, o 'MET'
. El
valor 'SYSTEM'
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 mysql
,
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
mysql
. 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
/usr/share/zoneinfo
. 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
tz_file
que corresponde a una zona
horaria tz_name
, invoque a
mysql_tzinfo_to_sql de esta manera:
shell> mysql_tzinfo_to_sqltz_file
tz_name
| 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
tz_file
es el nombre de su archivo de
zona horaria:
shell> mysql_tzinfo_to_sql --leap tz_file
| 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 .frm
,
.MYD
, y .MYI
para las
tablas de zonas horarias MyISAM
. Estas tablas
deben pertenecer a la base de datos mysql
,
así que debe depositar los archivos en el subdirectorio
mysql
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”.