En MySQL, las bases de datos se corresponden con directorios dentro del directorio de datos. Cada tabla dentro de una base de datos corresponde a por lo menos un fichero dentro del directorio de la base de datos (y posiblemente más, dependiendo del motor de almacenamiento). Por lo tanto, es la sensibilidad a mayúsculas del sistema operativo subyacente la que determina la sensibilidad a mayúsculas en los nombres de tablas y bases de datos. Esto significa que los nombres de las tablas y las bases de datos son sensibles a mayúsculas en la mayoría de las variedades de Unix, pero no lo son en Windows. Una notable excepción es Mac OS X, el cual se basa en Unix pero utiliza en forma predeterminada un sistema de ficheros (HFS+) que no es sensible a mayúsculas. No obstante, Mac OS X también soporta volúmenes UFS, los cuales son sensibles a mayúsculas tal como cualquier Unix. Consulte Sección 1.7.4, “Extensiones MySQL al estándar SQL”.
Nota: Si bien los nombres de
bases de datos y tablas no son sensibles a mayúsculas en
algunas plataformas, no habría que referirse a una tabla o base
de datos con diferentes combinaciones de mayúsculas y
minúsculas dentro de la misma consulta. La siguiente consulta
podría fallar porque se refiere a una tabla como
my_table
y MY_TABLE
:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
Los nombres de columnas, índices, procedimientos almacenados y triggers no son sensibles a mayúsculas en ninguna plataforma, ni tampoco lo son los alias de columnas.
En forma predeterminada, los alias de tabla en MySQL 5.0 son
sensibles a mayúsculas en Unix, pero no en Windows o Mac OS X.
La siguiente consulta no funcionaría en Unix, porque se refiere
al alias en ambas formas a
y
A
:
mysql> SELECTnombre_col
FROMnombre_tabla
AS a -> WHERE a.nombre_col
= 1 OR A.nombre_col
= 2;
Sin embargo, la misma consulta está permitida en Windows. Para evitar estar pendiente de tales diferencias, lo mejor es adoptar una convención consistente, como crear y referirse a bases de datos y tablas usando siempre minúsculas. Esto es lo recomendado para lograr máxima portabilidad y facilidad de uso.
La forma en que los nombres de tablas y bases de datos se
almacenan en el disco y se usan en MySQL se define mediante la
variable de sistema lower_case_table_names
, a
la cual se le puede establecer un valor al iniciar
mysqld.
lower_case_table_names
puede tomar uno de los
siguientes valores:
Valor | Significado |
0 |
Los nombres de tablas y bases de datos se almacenan en disco usando el
esquema de mayúsculas y minúsculas especificado en las
sentencias CREATE TABLE o
CREATE DATABASE . Las comparaciones de
nombres son sensibles a mayúsculas. Esto es lo
predeterminado en sistemas Unix. Nótese que si se
fuerza un valor 0 con
--lower-case-table-names=0 en un
sistema de ficheros insensible a mayúsculas y se accede
a tablas MyISAM empleando distintos
esquemas de mayúsculas y minúsculas para el nombre,
esto puede conducir a la corrupción de los índices. |
1 |
Los nombres de tablas se almacenan en minúsculas en el disco y las comparaciones de nombre no son sensibles a mayúsculas. MySQL convierte todos los nombres de tablas a minúsculas para almacenamiento y búsquedas. En MySQL 5.0, este comportamiento también se aplica a nombres de bases de datos y alias de tablas. Este valor es el predeterminado en Windows y Mac OS X. |
2 |
Los nombres de tablas y bases de datos se almacenan en disco usando el
esquema de mayúsculas y minúsculas especificado en las
sentencias CREATE TABLE o
CREATE DATABASE , pero MySQL las
convierte a minúsculas en búsquedas. Las comparaciones
de nombres no son sensibles a mayúsculas.
Nota: Esto funciona
solamente en sistemas de ficheros
que no son sensibles a mayúsculas. Los nombres de las
tablas InnoDB se almacenan en
minúsculas, como cuando
lower_case_table_names vale 1. |
En MySQL 5.0 para Windows y Mac OS X, el valor predeterminado de
lower_case_table_names
es 1.
Si se utiliza MySQL en una sola plataforma, normalmente no
habrá que cambiar la variable
lower_case_table_names
. Sin embargo, se
pueden encontrar dificultades si se desea transferir tablas
entre plataformas cuyos sistemas de ficheros tengan diferente
sensibilidad a mayúsculas. Por ejemplo, en Unix, se pueden
tener dos tablas diferentes llamadas mi_tabla
y MI_TABLA
, pero en Windows, estos dos
nombres se consideran idénticos. Para evitar problemas de
transferencia de datos originados en la combinación de
mayúsculas y minúsculas de los nombres de bases de datos y
tablas, se tienen dos opciones:
Emplear lower_case_table_names=1
en todos
los sistemas. La principal desventaja de esto es que al
emplear SHOW TABLES
o SHOW
DATABASES
no se verán los nombres en su
combinación original de minúsculas y mayúsculas.
Emplear lower_case_table_names=0
en Unix
y lower_case_table_names=2
en Windows.
Esto preserva la combinación de mayúsculas y minúsculas
en los nombres de bases de datos y tablas. La desventaja es
que hay que tener la precaución de que las consultas
siempre se refieran a las bases de datos y tablas en Windows
respetando la combinación correcta de mayúsculas y
minúsculas. Si se transfirieran las consultas a Unix, donde
las mayúsculas y minúsculas son significativas, no
funcionarán si no se utiliza la combinación correcta.
Excepción: Si se utilizan
tablas InnoDB
, se debería establecer
lower_case_table_names
en 1 en todas las
plataformas para forzar a que los nombres sean convertidos a
minúsculas.
Notar que antes de establecer
lower_case_table_names
en 1 en Unix, se
deberán convertir a minúsculas los nombres de bases de datos y
tablas existentes antes de reiniciar mysqld.
É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.