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 .frm
y a
identificadores almacenados en las tablas de permisos en la base
de datos mysql
. 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
ANSI_QUOTES
, 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 a`b
que contiene una
columna llamada c"d
:
mysql> CREATE TABLE `a``b` (`c"d` INT);
Se recomienda que no se utilicen nombres con el esquema
X
eX
,
tal como 1e
o 2e2
, porque
una expresión como 1e+1
es ambigua. Podría
interpretarse como la expresión 1e + 1
o como
el número 1e+1
, dependiendo del contexto.
Hay que ser cuidadoso al utilizar MD5
para
producir nombres de tablas, porque puede producir nombres ilegales
como los listados anteriormente.
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 |
col_name
|
La columna col_name de cualquier tabla
empleada en la consulta que contenga una columna con ese
nombre |
tbl_name.col_name
|
La columna col_name de la tabla
tbl_name en la base de datos
predeterminada. |
db_name.tbl_name.col_name
|
La columna col_name en la tabla
tbl_name en la base de datos
db_name . |
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,
`mi-tabla`.`mi-columna`
es legal, pero
`mi-tabla.mi-columna`
no lo es.
No es necesario especificar un prefijo de
nombre_tabla
o
nombre_bd.nombre_tabla
para
referenciar una columna en una sentencia a menos que la
referencia sea ambigua. Supóngase el caso de las tablas
t1
y t2
cada una
conteniendo una columna c
, donde se recupera
c
en una sentencia SELECT
que emplea ambas tablas t1
y
t2
. En este caso, c
es
ambiguo porque no es único entre las tablas utilizadas en la
sentencia. Se lo debe calificar con un nombre de tabla como
t1.c
o t2.c
para indicar a
cuál tabla se refiere la consulta. Del mismo modo, para
recuperar desde una tabla t
en la base de
datos db1
y desde la tabla
t
en la base de datos db2
en la misma sentencia, hay que referirse a las columnas en
aquellas tablas como db1.t.col_name
y
db2.t.col_name
.
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 .tbl_name
hace referencia
a la tabla tbl_name
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 '.
'.
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 emplearSHOW TABLES
oSHOW 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 ylower_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 establecerlower_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.