¿Los nombres de tabla en MySQL distinguen entre mayúsculas y minúsculas?

173

¿Los nombres de tabla en MySQL distinguen entre mayúsculas y minúsculas?

En mi máquina de desarrollo de Windows, el código que tengo es capaz de consultar mis tablas que parecen estar en minúsculas. Cuando despliegue el servidor de prueba en nuestro centro de datos, los nombres de las tablas parecen comenzar con una letra mayúscula.

Los servidores que utilizamos están todos en Ubuntu.

benstpierre
fuente

Respuestas:

203

En general:

Los nombres de bases de datos y tablas no distinguen entre mayúsculas y minúsculas en Windows, y distinguen entre mayúsculas y minúsculas en la mayoría de las variedades de Unix.

En MySQL, las bases de datos corresponden a directorios dentro del directorio de datos. Cada tabla dentro de una base de datos corresponde al menos a un archivo dentro del directorio de la base de datos. En consecuencia, la distinción entre mayúsculas y minúsculas del sistema operativo subyacente juega un papel importante en la distinción entre mayúsculas y minúsculas de los nombres de bases de datos y tablas.

Se puede configurar cómo se almacenan los nombres de las tablas en el disco utilizando la variable del sistema lower_case_table_names(en el archivo de configuración my.cnf en [mysqld]).

Lea la sección: 10.2.2 Identificador de mayúsculas y minúsculas para obtener más información.

Mármol Nublado
fuente
40
¡Esto me quemó por completo ya que mi código funcionaba muy bien en mi entorno de Windows local, pero arrojaba excepciones cuando pasaba a producción en Linux! ¡Gracias!
portforwardpodcast
66
Hay una advertencia para esta respuesta, que no se menciona en la documentación: InnoDB no utiliza nombres de archivo o directorio para bases de datos y tablas, y por lo tanto sus objetos siempre distinguen entre mayúsculas y minúsculas, incluso cuando se ejecutan en un sistema sensible a mayúsculas y minúsculas. Vea esta pregunta para ver un ejemplo de lo que puede salir mal debido a esto: stackoverflow.com/questions/23182969/…
Julio
Esta no es toda la historia. vea la respuesta de StephenLembert, ya que es configurable
Chris Wood
1
Por defecto, la mayoría de las computadoras Mac usan un sistema de archivos que no distingue entre mayúsculas y minúsculas. Sin embargo, puede optar por que su sistema de archivos distinga entre mayúsculas y minúsculas.
Chad
Esta y la distinción entre mayúsculas y minúsculas del archivo es una de las razones que me llevaron a mudarme a Ubuntu como desarrollador web.
Muhammad bin Yusrat
99

Los nombres de bases de datos y tablas no distinguen entre mayúsculas y minúsculas en Windows, y distinguen entre mayúsculas y minúsculas en la mayoría de las variedades de Unix o Linux.

para resolver el problema, establezca lower_case_table_names en 1

lower_case_table_names = 1

esto hará que todas sus tablas sean minúsculas, sin importar cómo las escriba

StephenLembert
fuente
1
Tampoco distinguen entre mayúsculas y minúsculas en MacOS X, a pesar de que lo es Unix subyacente. Presumiblemente, esta es la razón por la que el autocompletado dentro de MySQL en Mac distingue entre mayúsculas y minúsculas para nombres de tablas o campos, aunque las consultas no lo sean.
David
Sí, pero hay que poner esta declaración? Supongo que está en: /etc/mysql/my.cnf debajo del grupo [mysql]. Pero esto no es suficiente, aún hay que hacer algo más (además de, por supuesto, reiniciar mysql ...
Alg_D
1
Esto solo afecta a las tablas nuevas. Las tablas existentes deben renombrarse a minúsculas antes de cambiar esta configuración.
Martin
19

Los nombres de tabla en MySQL son entradas del sistema de archivos, por lo que no distinguen entre mayúsculas y minúsculas si el sistema de archivos subyacente lo es.

Oswald
fuente
3
No creo que eso sea siempre cierto para las tablas InnoDB.
Simon East
@SimonEast ¿Podría dar una razón por la que piensa eso?
Arya
16

Depende de la lower_case_table_namesvariable del sistema:

show variables where Variable_name='lower_case_table_names'

Hay tres valores posibles para esto:

  • 0- el maletín especificado en la declaración CREATE TABLEo CREATE DATABASE. Las comparaciones de nombres distinguen entre mayúsculas y minúsculas.
  • 1 - Los nombres de las tablas se almacenan en minúsculas en el disco y las comparaciones de nombres no distinguen entre mayúsculas y minúsculas.
  • 2- Lettercase especificado en la instrucción CREATE TABLEor CREATE DATABASE, pero MySQL los convierte a minúsculas en la búsqueda. Las comparaciones de nombres no distinguen entre mayúsculas y minúsculas.

Documentación

Raman Sahasi
fuente
11
  1. Localizar archivo en /etc/mysql/my.cnf

  2. Edite el archivo agregando las siguientes líneas:

    [mysqld]

    lower_case_table_names=1

  3. sudo /etc/init.d/mysql restart

  4. corre mysqladmin -u root -p variables | grep tablepara comprobar que lower_case_table_nameses 1ahora

Es posible que deba volver a crear estas tablas para que funcione

sendon1982
fuente