Apakah nama tabel dalam case MySQL sensitif?

173

Apakah nama tabel dalam case MySQL sensitif?

Pada mesin pengembangan Windows saya, kode yang saya miliki dapat menanyakan tabel saya yang nampaknya huruf kecil semua. Ketika saya menyebarkan ke server pengujian di pusat data kami, nama tabel tampak mulai dengan huruf besar.

Server yang kami gunakan semuanya ada di Ubuntu.

benstpierre
sumber

Jawaban:

203

Secara umum:

Basis data dan nama tabel tidak peka huruf besar-kecil pada Windows, dan peka huruf besar-kecil pada sebagian besar varietas Unix.

Di MySQL, database terkait dengan direktori dalam direktori data. Setiap tabel dalam basis data terkait dengan setidaknya satu file dalam direktori basis data. Akibatnya, sensitivitas case dari sistem operasi yang mendasarinya memainkan bagian dalam sensitivitas case dari database dan nama tabel.

Orang dapat mengkonfigurasi bagaimana nama tabel disimpan di disk menggunakan variabel sistem lower_case_table_names(dalam file konfigurasi my.cnf di [mysqld]).

Baca bagian: 10.2.2 Sensitivitas Huruf Pengidentifikasi untuk informasi lebih lanjut.

CloudyMarble
sumber
40
Ini benar-benar membakar saya karena kode saya berfungsi dengan baik di lingkungan windows lokal saya, tetapi melemparkan pengecualian ketika dipindahkan ke produksi di linux !! Terima kasih!
portforwardpodcast
6
Ada satu peringatan untuk jawaban ini, yang tidak disebutkan dalam dokumentasi: InnoDB tidak menggunakan nama file atau direktori untuk database dan tabel, dan karena itu objeknya selalu tidak sensitif huruf besar, bahkan ketika dijalankan pada sistem case sensitif. Lihat pertanyaan ini untuk contoh apa yang salah karena hal ini: stackoverflow.com/questions/23182969/…
Jules
ini bukan keseluruhan cerita. lihat jawaban StephenLembert karena dapat dikonfigurasi
Chris Wood
1
Secara default, kebanyakan komputer mac menggunakan sistem file case-insensitive. Anda dapat memilih ikut serta agar sistem file Anda peka terhadap huruf besar-kecil.
Chad
Ini dan sensitivitas case name file adalah salah satu alasan yang membuat saya pindah ke Ubuntu sebagai pengembang web.
Muhammad bin Yusrat
99

Basis data dan nama tabel tidak peka huruf besar-kecil pada Windows, dan huruf besar-kecil di sebagian besar varietas Unix atau Linux.

untuk mengatasi masalah ini atur lower_case_table_names menjadi 1

lower_case_table_names = 1

ini akan membuat semua tabel Anda menjadi huruf kecil, tidak peduli bagaimana Anda menulisnya

StephenLembert
sumber
1
Mereka juga tidak peka terhadap huruf besar pada MacOS X, meskipun Unix yang mendasarinya. Ini mungkin mengapa autocomplete dalam MySQL pada Mac peka huruf besar-kecil untuk nama tabel atau bidang meskipun permintaan tidak.
David
Ya, tetapi di sana untuk menempatkan pernyataan ini? Saya kira itu ada di: /etc/mysql/my.cnf di bawah grup [mysql]. Tapi ini tidak cukup, masih ada hal lain yang perlu dilakukan (selain tentu saja restart mysql ...
Alg_D
1
Ini hanya memengaruhi tabel baru. Tabel yang ada harus diubah namanya menjadi huruf kecil sebelum mengubah pengaturan ini.
Martin
19

Nama tabel di MySQL adalah entri sistem file, sehingga tidak peka huruf besar-kecil jika sistem file yang mendasarinya.

Oswald
sumber
3
Saya tidak berpikir itu selalu benar untuk tabel InnoDB.
Simon East
@SimonEast Maukah Anda memberi alasan mengapa Anda berpikir demikian?
Arya
16

Itu tergantung pada lower_case_table_namesvariabel sistem:

show variables where Variable_name='lower_case_table_names'

Ada tiga nilai yang mungkin untuk ini:

  • 0- huruf yang ditentukan dalam pernyataan CREATE TABLEatau CREATE DATABASE. Perbandingan nama adalah case-sensitive.
  • 1 - Nama tabel disimpan dalam huruf kecil pada disk dan perbandingan nama tidak peka huruf besar-kecil.
  • 2- huruf yang ditentukan dalam pernyataan CREATE TABLEatau CREATE DATABASE, tetapi MySQL mengubahnya menjadi huruf kecil saat pencarian. Perbandingan nama tidak peka huruf besar-kecil.

Dokumentasi

Raman Sahasi
sumber
11
  1. Temukan file di /etc/mysql/my.cnf

  2. Edit file dengan menambahkan baris berikut:

    [mysqld]

    lower_case_table_names=1

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

  4. menjalankan mysqladmin -u root -p variables | grep tableuntuk memeriksa bahwa lower_case_table_namesadalah 1sekarang

Anda mungkin perlu membuat kembali tabel ini untuk membuatnya berfungsi

sendon1982
sumber