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 enMySQL.
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.
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.
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 sistemalower_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.0c
|
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 tengaC 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 tipcono 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.
No hay comentarios:
Publicar un comentario