Czy w nazwach tabel w MySQL rozróżniana jest wielkość liter?

173

Czy w nazwach tabel w MySQL rozróżniana jest wielkość liter?

Na moim komputerze programistycznym z systemem Windows kod, który mam, jest w stanie przeszukiwać moje tabele, które wydają się być małe. Kiedy wdrażam na serwer testowy w naszym centrum danych, nazwy tabel wydają się zaczynać od dużej litery.

Wszystkie serwery, których używamy, znajdują się w systemie Ubuntu.

benstpierre
źródło

Odpowiedzi:

203

Ogólnie:

W nazwach baz danych i tabel nie jest rozróżniana wielkość liter w systemie Windows i wielkość liter w większości odmian systemu Unix.

W MySQL bazy danych odpowiadają katalogom w katalogu danych. Każda tabela w bazie danych odpowiada co najmniej jednemu plikowi w katalogu bazy danych. W konsekwencji rozróżnianie wielkości liter w bazowym systemie operacyjnym odgrywa rolę w rozróżnianiu wielkości liter w nazwach baz danych i tabel.

Można skonfigurować sposób przechowywania nazw tabel na dysku za pomocą zmiennej systemowej lower_case_table_names(w pliku konfiguracyjnym my.cnf w [mysqld]).

Przeczytaj rozdział: 10.2.2 Rozróżnianie wielkości liter w identyfikatorze, aby uzyskać więcej informacji.

PochmurnoMarmur
źródło
40
To całkowicie mnie spaliło, ponieważ mój kod działał świetnie w lokalnym środowisku Windows, ale rzucał wyjątki, gdy został przeniesiony do produkcji na Linuksie! Dzięki!
portforwardpodcast
6
Jest jedno zastrzeżenie do tej odpowiedzi, o którym nie wspomniano w dokumentacji: InnoDB nie używa nazw plików lub katalogów dla baz danych i tabel, dlatego też w jego obiektach jest zawsze rozróżniana wielkość liter, nawet jeśli jest uruchamiany w systemie z rozróżnianiem wielkości liter. Zobacz to pytanie, aby zobaczyć, co może pójść nie tak z tego powodu: stackoverflow.com/questions/23182969/…
Jules
to nie wszystko. zobacz odpowiedź StephenaLemberta, ponieważ można ją skonfigurować
Chris Wood
1
Domyślnie większość komputerów Mac używa systemu plików bez rozróżniania wielkości liter. Możesz jednak wyrazić zgodę na to, aby w systemie plików była rozróżniana wielkość liter.
Czad,
To oraz uwzględnianie wielkości liter w nazwach plików jest jednym z powodów, dla których przeniosłem się na Ubuntu jako programistę WWW.
Muhammad bin Yusrat,
99

W nazwach baz danych i tabel nie jest rozróżniana wielkość liter w systemie Windows oraz wielkość liter w większości odmian systemów Unix i Linux.

aby rozwiązać ten problem, ustaw lower_case_table_names na 1

lower_case_table_names = 1

dzięki temu wszystkie tabele będą pisane małymi literami, niezależnie od tego, jak je napiszesz

StephenLembert
źródło
1
W systemie MacOS X nie jest też rozróżniana wielkość liter, mimo że bazowy Unix tak. Prawdopodobnie dlatego autouzupełnianie w MySQL na Macu rozróżnia wielkość liter w nazwach tabel lub pól, mimo że zapytania nie są.
David,
Tak, ale tam umieścić to oświadczenie? Myślę, że jest w: /etc/mysql/my.cnf poniżej grupy [mysql]. Ale to nie wystarczy, jeszcze coś jeszcze do zrobienia (oprócz oczywiście restart mysql ...
Alg_D
1
Dotyczy to tylko nowych tabel. Istniejące tabele należy zmienić na małe litery przed zmianą tego ustawienia.
Martin
19

Nazwy tabel w MySQL są wpisami systemu plików, więc wielkość liter nie jest rozróżniana, jeśli bazowy system plików to.

Oswald
źródło
3
Myślę, że nie zawsze tak jest w przypadku tabel InnoDB.
Simon East,
@SimonEast Czy możesz podać powód, dla którego tak uważasz?
Arya
16

Zależy to od lower_case_table_nameszmiennej systemowej:

show variables where Variable_name='lower_case_table_names'

Istnieją trzy możliwe wartości:

  • 0- wielkość liter określona w instrukcji CREATE TABLElub CREATE DATABASE. Porównania nazw uwzględniają wielkość liter.
  • 1 - Nazwy tabel są przechowywane na dysku małymi literami, a porównania nazw nie uwzględniają wielkości liter.
  • 2- litera określona w instrukcji CREATE TABLElub CREATE DATABASE, ale MySQL konwertuje je na małe litery podczas wyszukiwania. Porównania nazw nie uwzględniają wielkości liter.

Dokumentacja

Raman Sahasi
źródło
11
  1. Zlokalizuj plik w /etc/mysql/my.cnf

  2. Edytuj plik, dodając następujące wiersze:

    [mysqld]

    lower_case_table_names=1

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

  4. biegnij, mysqladmin -u root -p variables | grep tableaby sprawdzić, czy lower_case_table_namesto 1teraz

Może być konieczne ponowne utworzenie tych tabel, aby działały

sendon1982
źródło