Os nomes de tabela no MySQL diferenciam maiúsculas de minúsculas?

173

Os nomes de tabela no MySQL diferenciam maiúsculas de minúsculas?

Na minha máquina de desenvolvimento do Windows, o código que tenho é capaz de consultar minhas tabelas, que parecem todas minúsculas. Quando implanto no servidor de teste em nosso datacenter, os nomes das tabelas parecem começar com uma letra maiúscula.

Os servidores que usamos estão todos no Ubuntu.

benstpierre
fonte

Respostas:

203

Em geral:

Os nomes de bancos de dados e tabelas não diferenciam maiúsculas de minúsculas no Windows e diferenciam maiúsculas de minúsculas na maioria das variedades do Unix.

No MySQL, os bancos de dados correspondem aos diretórios dentro do diretório de dados. Cada tabela em um banco de dados corresponde a pelo menos um arquivo no diretório do banco de dados. Conseqüentemente, a distinção entre maiúsculas e minúsculas do sistema operacional subjacente desempenha um papel na diferenciação de maiúsculas e minúsculas dos nomes de banco de dados e tabela.

Pode-se configurar como os nomes das tabelas são armazenados no disco usando a variável do sistema lower_case_table_names(no arquivo de configuração my.cnf em [mysqld]).

Leia a seção: 10.2.2 Sensibilidade da caixa do identificador para obter mais informações.

CloudyMarble
fonte
40
Isso me queimou totalmente, pois meu código estava funcionando muito bem no meu ambiente local do Windows, mas lançando exceções ao entrar em produção no linux !! Obrigado!
Portforwardpodcast
6
Há uma ressalva para esta resposta, que não é mencionada na documentação: O InnoDB não usa nomes de arquivos ou diretórios para bancos de dados e tabelas e, portanto, seus objetos são sempre diferenciam maiúsculas de minúsculas, mesmo quando executados em um sistema que diferencia maiúsculas de minúsculas. Veja esta pergunta para um exemplo do que pode dar errado por causa disso: stackoverflow.com/questions/23182969/…
Jules
essa não é a história toda. ver a resposta de StephenLembert como é configurável
Chris Wood
1
Por padrão, a maioria dos computadores Mac usa um sistema de arquivos que não diferencia maiúsculas de minúsculas. Você pode optar por fazer com que seu sistema de arquivos faça distinção entre maiúsculas e minúsculas.
Chad
Essa diferenciação entre maiúsculas e minúsculas é um dos motivos que me levou a mudar para o Ubuntu como desenvolvedor web.
Muhammad bin Yusrat
99

Os nomes de banco de dados e tabela não diferenciam maiúsculas de minúsculas no Windows e diferenciam maiúsculas de minúsculas na maioria das variedades de Unix ou Linux.

para resolver o problema, defina o lower_case_table_names como 1

lower_case_table_names = 1

isso tornará todas as suas tabelas em minúsculas, não importa como você as escreva

StephenLembert
fonte
1
Eles também não diferenciam maiúsculas de minúsculas no MacOS X, mesmo que o Unix subjacente seja. Provavelmente, é por isso que o preenchimento automático no MySQL no Mac faz distinção entre maiúsculas e minúsculas para nomes de tabelas ou campos, mesmo que as consultas não sejam.
David David
Sim, mas existe para colocar esta afirmação? Eu acho que está no: /etc/mysql/my.cnf abaixo do grupo [mysql]. Mas isso não é suficiente, ainda algo necessidades mais a ser feito (além é claro de reinício mysql ...
Alg_D
1
Isso afeta apenas novas tabelas. As tabelas existentes precisam ser renomeadas para minúsculas antes de alterar essa configuração.
Martin
19

Os nomes de tabela no MySQL são entradas do sistema de arquivos, portanto, não diferenciam maiúsculas de minúsculas se o sistema de arquivos subjacente for.

Oswald
fonte
3
Eu não acho que isso sempre seja verdade para as tabelas do InnoDB.
Simon Médio
@SimonEast Por favor, dê uma razão para você pensar isso?
Arya
16

Depende da lower_case_table_namesvariável do sistema:

show variables where Variable_name='lower_case_table_names'

Existem três valores possíveis para isso:

  • 0- letra especificada na declaração CREATE TABLEou CREATE DATABASE. As comparações de nomes diferenciam maiúsculas de minúsculas.
  • 1 - Os nomes das tabelas são armazenados em minúsculas no disco e as comparações de nomes não diferenciam maiúsculas de minúsculas.
  • 2- letra especificada no CREATE TABLEouCREATE DATABASE instrução , mas o MySQL as converte para minúsculas na pesquisa. As comparações de nomes não diferenciam maiúsculas de minúsculas.

Documentação

Raman Sahasi
fonte
11
  1. Localize o arquivo em /etc/mysql/my.cnf

  2. Edite o arquivo adicionando as seguintes linhas:

    [mysqld]

    lower_case_table_names=1

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

  4. corra mysqladmin -u root -p variables | grep tablepara verificar se lower_case_table_namesé 1agora

Pode ser necessário recriar essas tabelas para fazê-lo funcionar

sendon1982
fonte