Varias variables de sistema de conjunto de caracteres y colaciones están relacionadas con la interacción cliente-servidor. Algunas de ellas se han mencionado en secciones anteriores:
El conjunto de caracteres y la colación del servidor están
disponibles como los valores de las variables
character_set_server
y
collation_server
.
El conjunto de caracteres y la colación de la base de datos
por defecto están disponibles como valores de las variables
character_set_database
y
collation_database
.
Variables de conjuntos de caracteres y colaciones adicionales están involucradas en tratar el tráfico para la conexión entre un cliente y el servidor. Cada cliente tiene variables para el conjunto de caracteres y colación relacionados con la conexión.
Una “conexión” es lo que se hace al conectarse con el servidor. El cliente envía comandos SQL, tales como consultas, mediante la conexión al servidor. El servidor envía respuestas, tales como resultados, mediante la conexión de vuelta al cliente. Esto genera preguntas sobre tratamiento de conjuntos de caracteres y colaciones para conexiones de cliente, cada una de ellas puede responderse mediante variables de sistema:
¿ Qué conjunto de caracteres usa una consulta al salir del cliente?
El servidor toma la variable
character_set_client
para usarla en las
consultas enviadas por el cliente.
¿ Qué conjunto de caracteres debería usar el servidor para traducir una consulta tras recibirla?
Para esto, el servidor usa
character_set_connection
y
collation_connection
. Esto convierte las
consultas enviadas por el cliente de
character_set_client
a
character_set_connection
(excepto para
cadenas de caracteres literales que tienen un introductor
como _latin1
o _utf8
).
collation_connection
es importante para
comparaciones de cadenas de caracteres literales. Para
comparaciones de cadenas de caracteres con valores de
columnas no importa, ya que las columnas tienen una
precedencia mayor en las colaciones.
¿ Qué conjunto de caracteres debería usar el servidor para traducir los resultados o errores antes de enviar el mensaje de vuelta al cliente?
La variable character_set_results
indica
el conjunto de caracteres usado por el servidor para
devolver los resultados de las consultas al cliente. Esto
incluye datos resultantes como los valores de las columnas,
y metadatos resultantes como nombres de columnas.
Puede ajustar estas variables, o puede depender de los valores por defecto (en tal caso, puede obviar esta sección).
Hay dos comandos que afectan al conjunto de caracteres de conexión:
SET NAMES 'nombre_de_conjunto_de_caracteres
' SET CHARACTER SETnombre_de_conjunto_de_caracteres
SET NAMES
indica qué hay en el comando SQL
que envía el cliente. Por lo tanto, SET NAMES
'cp1251'
le dice al servidor “los próximos
mensajes entrantes de este cliente están en el conjunto de
caracteres cp1251
.” También
especifica el conjunto de caracteres para los resultados que el
servidor devuelve al cliente. (Por ejemplo, indica los conjuntos
de caracteres de la columna si usa el comando
SELECT
.)
Un comando SET NAMES
'
es equivalente a estos
tres comandos:
x
'
mysql> SET character_set_client =x
; mysql> SET character_set_results =x
; mysql> SET character_set_connection =x
;
Cambiar character_set_connection
a
x
también cambia
collation_connection
de la colación por
defecto a x
.
SET CHARACTER SET
es similar pero cambia el
conjunto de caracteres y la colación para la conexión para ser
las de la base de datos por defecto. Un comando SET
CHARACTER SET x
es equivalente a estos tres comandos:
mysql> SET character_set_client =x
; mysql> SET character_set_results =x
; mysql> SET collation_connection = @@collation_database;
Cuando un cliente se conecta, envía al servidor el nombre del
conjunto de caracteres que quiere usar. El servidor cambia las
variables character_set_client
,
character_set_results
, y
character_set_connection
para ese conjunto de
caracteres. (De hecho, el servidor efectúa una operación
SET NAMES
usando el conjunto de caracteres).
No es necesario ejecutar SET NAMES
cada vez
que se arranca el cliente mysql, aunque se
quiera utilizar un conjunto de caracteres diferente del que hay
por defecto. Puede añadirse la opción
--default-character-set
en la línea de
comandos de mysql, o en el fichero de
opciones. Por ejemplo, el siguiente fichero de opciones cambia
las variables del conjunto de caracteres a
koi8r
cada vez que se ejecuta
mysql:
[mysql] default-character-set=koi8r
Ejemplo: Supongamos que column1
se define
como CHAR(5) CHARACTER SET latin2
. Si no se
especifica SET NAMES
o SET CHARACTER
SET
, entonces para SELECT column1 FROM
t
, el servidor devuelve todos los valores para
column1
usando el conjunto de caracteres que
el cliente especificó al conectar. Por otro lado, si se
especifica SET NAMES 'latin1'
o SET
CHARACTER SET latin1
, entonces justo antes de devolver
los resultados, el servidor convierte el valor
latin2
a latin1
. La
conversión puede perder información si hay caracteres que no
están en ambos conjuntos de caracteres.
Si no se quiere que el servidor haga ninguna conversión, debe
cambiarse character_set_results
a
NULL
:
mysql> SET character_set_results = NULL;
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.