Apendice B Reglas para nombres de bases de datos, tablas, índices, columnas y alias

Este apéndice es una traducción del manual de MySQL.

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

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

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

Como añadido a las restricciones comentadas en la tabla, ningún identificador puede contener el valor ASCII 0 o un byte con el valor 255. Los nombres de bases de datos, tablas y columnas no pueden terminar con espacios. Antes de MySQL 4.1, los caracteres de comillas no deben ser usados en los identificadores.

A partir de MySQL 4.1, los identificadores se almacenan usando Unicode (UTF8). Esto se aplica a los identificadores de definiciones de tabla que se almacenan en ficheros '.frm' y a identificadores almacenados en las tablas de privilegios en la base de datos mysql. Aunque los identificadores Unicode pueden incluir caracteres multi-byte, hay que tener en cuenta que las longitudes máximas mostradas en la tabla se cuentan en bytes. Si un identificador contiene caracteres multi-byte, el número de caracteres permitidos para él será menor que el valor mostrado en la tabla.

Un identificador puede estar o no entrecomillado. Si un identificador es una palabra reservada o contiene caracteres especiales, se debe entrecomillar cada vez que sea referenciado. Para ver una lista de las palabras reservadas, ver la sección palabras reservadas. Los caracteres especiales son aquellos que están fuera del conjunto de caracteres alfanuméricos para el conjunto de caracteres actual, '_' y '$'.

El carácter de entrecomillado de identificadores es la tilde izquierda ('`'):

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

Si el modo del servidor SQL incluye la opción de modo ANSI_QUOTES, también estará permitido entrecomillar 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)

Desde MySQL 4.1, los caracteres de entrecomillado de identificadores pueden ser incluidos en el interior de un identificador si éste se entrecomilla. Si el carácter a incluir dentro del identificador es el mismo que se usa para entrecomillar el propio identificador, hay que duplicar el carácter. La siguiente sentencia crea una tabla con el nombre a`b que contiene una columna llamada c"d:

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

El entrecomillado de identificadores se introdujo en MySQL 3.23.6 para permitir el uso de identificadores que sean palabras reservadas o que contengan caracteres especiales. Antes de la versión 3.23.6, no es posible usar identificadores que requieran entrecomillado, de modo que las reglas para los identificadores legales son más restrictivas:

  • Un nombre debe consistir en caracteres alfanuméricos del conjunto de caracteres actual, '_' y '$'. El conjunto de caracteres por defecto es ISO-8859-1 (Latin1). Esto puede ser cambiado con la opción --default-character-set de mysqld.
  • Un nombre puede empezar con cualquier carácter que sea legal en el nombre. En particular, un nombre puede empezar con un dígito; esto difiere de muchos otros sistemas de bases de datos. Sin embargo, un nombre sin entrecomillar no puede consistir sólo de dígitos.
  • No se puede usar el carácter '.' en nombres ya que se usa para para extender el formato con el que se puede hacer referencia a columnas.

Es recomendable no usar nombres como 1e, porque una expresión como 1e+1 es ambigua. Puede ser interpretada como la expresión 1e + 1 o como el número 1e+1, dependiendo del contexto.

Calificadores de identificadores

MySQL permite nombres que consisten en un único identificador o en múltiples identificadores. Los componentes de un nombre compuesto deben estar separados por un punto ('.'). Las partes iniciales de un nombre compuesto actúan como calificadores que afectan al contexto dentro de cual, se interpreta el identificador final.

En MySQL se puede hacer referencia a una columna usando cualquiera de las formas siguientes:

Referencia de columna Significado
nombre_columna La columna nombre_columna de cualquiera de las tablas usadas en la consulta que contenga una columna con ese nombre.
nombre_tabla.nombre_columna La columna nombre_columna de la tabla nombre_tabla de la base de datos por defecto.
nombre_basedatos.nombre_tabla.nombre_columna La columna nombre_columna de la tabla nombre_tabla de la base de datos nombre_basedatos. Esta sintaxis no está disponible antes de MySQL 3.22.

Si cualquiera de los componentes d eun nombre con varias partes requiere entrecomillado, hay que entrecomillar cada uno individualmente en lugar de entrecomillarlo completo. Por ejemplo, `mi-tabla`.`mi-columna` es legal, sin embargo `mi-tabla.mi-columna` no.

No será necesario especificar un prefijo de nombre de tabla o de base de datos para una referencia de columna en una sentencia a no ser que la referencia pueda ser ambigua. Supongamos que las tablas t1 y t2 contienen cada una una columna c, y se quiere recuperar c en una sentencia SELECT que usa ambas tablas. En ese caso, c es ambiguo porque no es único entre las dos tablas usadas. Se debe calificar con el nombre de la tabla como t1.c o t2.c para indicar a que tabla nos referimos. De modo similar, para recuperar datos desde una tabla t en una base de datos db1 y desde una tabla t en una base de datos db2 en la misma sentencia, se debe hacer referencia a las columnas en esas tablas como db1.t.nombre_columna y db2.t.nombre_columna.

La sintaxis .nombre_tabla significa la tabla nombre_tabla en la base de datos actual. Esta sintaxis se acepta por compatibilidad con ODBC ya que algunos programas ODBC usan el '.' como prefijos para nombres de tablas.

Sensibilidad al tipo

En MySQL, las bases de datos corresponden a directorios dentro del directorio de datos "data". A las tablas dentro de una base de datos les corresponde, por lo menos, un fichero dentro del directorio de la base de datos (y posiblemente más, dependiendo del motor de almacenamiento). En consecuencia, la distinción entre mayúsculas y minúsculas que haga el sistema operativo determinará la distinción que se haga en los nombres de bases de datos y de tablas. Esto signigica que los nombres de bases de datos y tablas no son sensibles al tipo en Windows, y sí lo son en la mayor parte de las variantes de Unix. Una excepción notable es Mac OS X, que está basado en Unix pero usa un sistema de ficheros por defecto del tipo (HFS+) que no es sensible al tipo. Sin embargo, Mac OS X también soporta volúmenes UFS, los cuales son sensibles al tipo lo mismo que cualquier Unix.

Nota:

Aunque nos nombres de bases de datos y tablas no sean sensibles al tipo en algunas plataformas, no se debe hacer referencia a una base de datos o tabla dada usando diferentes tipos en la misma consulta. La siguiente consulta no funciona porque se refiera a una tabla dos veces, una como my_table y otra como MY_TABLE.

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Los nombres de columna, índices y alias de columna no son sensibles al tipo en ninguna plataforma.

Los alias de tabla son sensibles al tipo antes de MySQL 4.1.1. La siguiente consulta no funcionará porque se refiere a un alias como a y como A:

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;

Si hay problemas para recordar el tipo de letras permitido para nombres de bases de datos y tablas, es mejor adoptar una convención rígida, como crear siempre las bases de datos y tablas con nombres que sólo contengan caracteres en minúsculas.

El modo en que se almacenan los nombres de tablas y bases de datos en disco y son usados en MySQL depende de la definición de la variable de sistema lower_case_table_names, la cual se puede asignar cuando se arranca mysqld. lower_case_table_names puede tomar uno de los valores siguientes:

Valor Significado
0 Los nombres de tablas y bases de datos se almacenan en disco usando los tipos de caracteres usados en en las sentencias CREATE TABLE o CREATE DATABASE. Las comparaciones de nombres son sensibles al tipo. Este es el valor en sistemas Unix. Si se fuerza este valor 0 con --lower-case-table-names=0 en un sistema de ficheros no sensible al tipo y se accede a nombres de tablas MyISAM usando diferentes tipos de caracteres, se puede producir corrupción de índices.
1 Los bombres de las tablas se almacenan en disco usando minúsculas y las comparaciones de nombres no son sensibles al tipo. MySQL convierte todos los nombres de tablas a minúsculas al almacenarlos y leerlos. Este comportamiento también se aplica a nombres de bases de datos desde MySQL 4.0.2, y a alias de tablas a partir de 4.1.1. Este es el valor por defecto en sistemas Windows y Mac OS X.
2 Los nombres de tablas y bases de datos se almacenan en disco usando el tipo de letra especificado en las sentencias CREATE TABLE o CREATE DATABASE, pero MySQL los convierte a minúscula al leerlos. Las comparaciones de nombres no son sensibles al tipo. Nota: esto funciona sólo en sistemas de ficheros que no sean sensibles al tipo. Los nombres de tablas InnoDB se almacenan en minúscylas, igual que si lower_case_table_names=1. Asignar lower_case_table_names a 2 se puede hacer desde MySQL 4.0.18.

Si sólo se está usando MySQL para una plataforma, generalmente no será necerasio modificar la variable lower_case_table_names variable. Sin embargo, se pueden presentar dificultades si se quieren transferir tablas entre plataformas que tengan sistemas de ficheros con distintas sensibilidades al tipo. Por ejemplo, en Unix, se pueden tener dos tablas diferentes llamadas my_table y MY_TABLE, pero en Windows estos nombres se consideran el mismo. Para impedir problemas de transferencia de datos debidos al tipo de letras usados en nombres de bases de datos o tablas, hay dos opciones:

  • Usar lower_case_table_names=1 en todos los sistemas. La desventaja principal con esta opción es que cuando se usa SHOW TABLES o SHOW DATABASES, no se ven los nombres en el tipo de letras original.
  • Usar lower_case_table_names=0 en Unix y lower_case_table_names=2 en Windows. Esto preserva el tipo de letras en nombres de bases de datos y tablas. La desventaja es que se dene asegurar que las consultas siempre se refieren a los nombres de bases de datos y tablas usando los tipos de caracteres correctos en Windows. Si se transfieren las consultas a Unix, donde el tipo de los caracteres es importante, no funcionarán si el tipo de letra es incorrecto.
Nota:

antes de asignar 1 a lower_case_table_names en Unix, se deben convertir los viejos nombres de bases de datos y tablas a minúscula antes de reiniciar mysqld.