9.2. Nombres de bases de datos, tablas, índices, columnas y alias

MySQL 5.0

9.2. Nombres de bases de datos, tablas, índices, columnas y alias

Los nombres de bases de datos, tablas, índices, columnas y alias son identificadores. Esta sección describe la sintaxis permitida para los identificadores de MySQL.

La siguiente tabla describe la longitud máxima y los caracteres permitidos para cada tipo de identificador.

Identificador Longitud máxima (en bytes) Caracteres permitidos
Base de datos 64 Cualquier carácter permitido en un nombre de directorio, excepto '', '', o ''
Tabla 64 Cualquier carácter permitido en un nombre de fichero, excepto '', '', o ''
Columna 64 Todos los caracteres
Índice 64 Todos los caracteres
Alias 255 Todos los caracteres

Adicionalmente a las restricciones detalladas en la tabla, ningún identificador puede contener un carácter ASCII 0 o un byte con un valor de 255. Los nombres de bases de datos, tablas y columnas no deberían terminar con caracteres de espacio. MySQL 5.0 permite el uso de comillas en identificadores, aunque es mejor evitarlos tanto como sea posible.

En MySQL 5.0, los identificadores se almacenan empleando Unicode (UTF8). Esto se aplica a identificadores en las definiciones de tabla que se almacenan en ficheros y a identificadores almacenados en las tablas de permisos en la base de datos . El tamaño de las columnas de tipo cadena en las tablas de permisos (y en cualquier otra tabla) de MySQL 5.0 equivale al número de caracteres, esto significa que (al contrario que en algunas versiones anteriores de MySQL) se pueden utilizar caracteres multibyte sin reducir el número de caracteres permitidos para los valores almacenados en estas columnas.

Un identificador puede estar encerrado entre comillas o no. Si un identificador es una palabra reservada o contiene caracteres especiales, se debe encerrar entre comillas cada vez que se haga referencia a él. Para una lista de palabras reservadas, consulte Sección 9.6, “Tratamiento de palabras reservadas en MySQL”. Los caracteres especiales son aquellos que están fuera del grupo de caracteres alfanuméricos del conjunto de caracteres en uso, de '', y de ''.

El carácter de encomillado de identificador es el acento grave: (''):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

Si el modo de servidor SQL incluye la opción , también está permitido delimitar los identificadores con comillas dobles:

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax. (...)
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

Consulte Sección 5.3.2, “El modo SQL del servidor”.

En MySQL 5.0, los caracteres delimitadores de identificador pueden incluírse dentro del identificador si se delimita el identificador. Si el carácter que se incluirá dentro del identificador es el mismo que se utiliza para delimitarlo, habrá que colocarlo en forma doble. Las siguientes sentencias crean una tabla llamada que contiene una columna llamada :

mysql> CREATE TABLE `a``b` (`c"d` INT);

Se recomienda que no se utilicen nombres con el esquema e, tal como o , porque una expresión como es ambigua. Podría interpretarse como la expresión o como el número , dependiendo del contexto.

Hay que ser cuidadoso al utilizar para producir nombres de tablas, porque puede producir nombres ilegales como los listados anteriormente.

9.2.1. Cualificadores de los identificadores

MySQL acepta nombres que pueden consistir en un solo identificador o múltiples identificadores. Los componentes de un nombre múltiple deben separarse con un punto (''). Las partes iniciales de un identificador múltiple actúan como calificadores que afectan el contexto en el cual se interpreta la parte final.

En MySQL es posible referirse a una columna empleando cualquiera de las siguientes formas:

Referencia de columna Significado
La columna de cualquier tabla empleada en la consulta que contenga una columna con ese nombre
La columna de la tabla en la base de datos predeterminada.
La columna en la tabla en la base de datos .

Si cualquier componente de un nombre múltiple requiere delimitarlo, hay que hacerlo individualmente en lugar de delimitar el nombre como un todo. Por ejemplo, es legal, pero no lo es.

No es necesario especificar un prefijo de o para referenciar una columna en una sentencia a menos que la referencia sea ambigua. Supóngase el caso de las tablas y cada una conteniendo una columna , donde se recupera en una sentencia que emplea ambas tablas y . En este caso, es ambiguo porque no es único entre las tablas utilizadas en la sentencia. Se lo debe calificar con un nombre de tabla como o para indicar a cuál tabla se refiere la consulta. Del mismo modo, para recuperar desde una tabla en la base de datos y desde la tabla en la base de datos en la misma sentencia, hay que referirse a las columnas en aquellas tablas como y .

Una palabra a continuación de un punto en un nombre calificado debe ser un identificador, por lo que no es necesario delimitarlo, aun si es una palabra reservada.

La sintaxis hace referencia a la tabla en la base de datos actual. Esta sintaxis se acepta por compatibilidad con ODBC, ya que algunos programas ODBC anteceden los nombres de tabla con un carácter ''.

9.2.2. Sensibilidad a mayúsuclas y minúsculas de identificadores

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 y :

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 y :

mysql> SELECT  FROM  AS a
    -> WHERE a. = 1 OR A. = 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 , a la cual se le puede establecer un valor al iniciar mysqld. puede tomar uno de los siguientes valores:

Valor Significado
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 o . 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 en un sistema de ficheros insensible a mayúsculas y se accede a tablas empleando distintos esquemas de mayúsculas y minúsculas para el nombre, esto puede conducir a la corrupción de los índices.
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.
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 o , 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 se almacenan en minúsculas, como cuando vale 1.

En MySQL 5.0 para Windows y Mac OS X, el valor predeterminado de es 1.

Si se utiliza MySQL en una sola plataforma, normalmente no habrá que cambiar la variable . 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 y , 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 en todos los sistemas. La principal desventaja de esto es que al emplear o no se verán los nombres en su combinación original de minúsculas y mayúsculas.

  • Emplear en Unix y 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 , se debería establecer en 1 en todas las plataformas para forzar a que los nombres sean convertidos a minúsculas.

Notar que antes de establecer en 1 en Unix, se deberán convertir a minúsculas los nombres de bases de datos y tablas existentes antes de reiniciar mysqld.