Là tên bảng trong trường hợp MySQL nhạy cảm?


173

Là tên bảng trong trường hợp MySQL nhạy cảm?

Trên máy phát triển Windows của tôi, mã tôi có thể truy vấn các bảng có vẻ như là chữ thường. Khi tôi triển khai đến máy chủ thử nghiệm trong trung tâm dữ liệu của chúng tôi, các tên bảng xuất hiện để bắt đầu bằng một chữ cái viết hoa.

Các máy chủ chúng tôi sử dụng đều có trên Ubuntu.


Câu trả lời:


203

Nói chung:

Tên cơ sở dữ liệu và bảng không phân biệt chữ hoa chữ thường trong Windows và phân biệt chữ hoa chữ thường trong hầu hết các loại Unix.

Trong MySQL, cơ sở dữ liệu tương ứng với các thư mục trong thư mục dữ liệu. Mỗi bảng trong cơ sở dữ liệu tương ứng với ít nhất một tệp trong thư mục cơ sở dữ liệu. Do đó, độ nhạy trường hợp của hệ điều hành cơ bản đóng một phần trong độ nhạy trường hợp của cơ sở dữ liệu và tên bảng.

Người ta có thể định cấu hình cách các tên bảng được lưu trữ trên đĩa bằng biến hệ thống lower_case_table_names(trong tệp cấu hình my.cnf trong [mysqld]).

Đọc phần: 10.2.2 Độ nhạy trường hợp định danh để biết thêm thông tin.


40
Điều này hoàn toàn đốt cháy tôi khi mã của tôi hoạt động rất tốt trên môi trường windows cục bộ của tôi, nhưng ném ngoại lệ khi chuyển sang sản xuất trên linux !! Cảm ơn!
portforwardpodcast

6
Có một lời cảnh báo cho câu trả lời này, điều này không được đề cập trong tài liệu: InnoDB không sử dụng tên tệp hoặc thư mục cho cơ sở dữ liệu và bảng, do đó, các đối tượng của nó luôn không phân biệt chữ hoa chữ thường, ngay cả khi chạy trên hệ thống phân biệt chữ hoa chữ thường. Xem câu hỏi này để biết ví dụ về những gì có thể sai vì điều này: stackoverflow.com/questions/23182969/ mẹo
Jules

đây không phải là toàn bộ câu chuyện xem câu trả lời của StephenLembert vì nó có thể cấu hình được
Chris Wood

1
Theo mặc định, hầu hết các máy tính mac đều sử dụng hệ thống tệp không phân biệt chữ hoa chữ thường. Tuy nhiên, bạn có thể chọn tham gia để hệ thống tệp của bạn phân biệt chữ hoa chữ thường.
Chad

Điều này và độ nhạy trường hợp tên tệp là một trong những lý do khiến tôi chuyển sang Ubuntu với tư cách là nhà phát triển web.
Muhammad bin Yusrat

99

Tên cơ sở dữ liệu và bảng không phân biệt chữ hoa chữ thường trong Windows và phân biệt chữ hoa chữ thường trong hầu hết các loại Unix hoặc Linux.

để giải quyết vấn đề, đặt low_case_table_names thành 1

low_case_table_names = 1

điều này sẽ làm cho tất cả các bảng của bạn viết thường, bất kể bạn viết chúng như thế nào


1
Chúng cũng không phân biệt chữ hoa chữ thường trên MacOS X, mặc dù Unix nằm bên dưới. Đây có lẽ là lý do tại sao tự động hoàn tất trong MySQL trên Mac phân biệt chữ hoa chữ thường cho tên bảng hoặc trường mặc dù các truy vấn không có.
David

Có, nhưng có để đưa ra tuyên bố này? Tôi đoán nó nằm trên: /etc/mysql/my.cnf bên dưới nhóm [mysql]. Nhưng điều này vẫn chưa đủ, vẫn còn một số việc khác cần phải làm (ngoài ra tất nhiên là khởi động lại mysql ...
Alg_D 5/2/2016

1
Điều này chỉ ảnh hưởng đến các bảng mới. Các bảng hiện có phải được đổi tên thành chữ thường trước khi thay đổi cài đặt này.
Martin

19

Tên bảng trong MySQL là các mục hệ thống tệp, vì vậy chúng không phân biệt chữ hoa chữ thường nếu hệ thống tệp cơ bản là.


3
Tôi không nghĩ điều đó luôn đúng với các bảng InnoDB.
Simon East

@SimonEast Bạn vui lòng cho biết lý do bạn nghĩ vậy chứ?
Arya

16

Nó phụ thuộc vào lower_case_table_namesbiến hệ thống:

show variables where Variable_name='lower_case_table_names'

Có ba giá trị có thể cho việc này:

  • 0- chữ cái được chỉ định trong CREATE TABLEhoặc CREATE DATABASEtuyên bố. Tên so sánh là trường hợp nhạy cảm.
  • 1 - Tên bảng được lưu bằng chữ thường trên đĩa và so sánh tên không phân biệt chữ hoa chữ thường.
  • 2- chữ cái được chỉ định trong câu lệnh CREATE TABLEhoặc CREATE DATABASE, nhưng MySQL chuyển đổi chúng thành chữ thường khi tra cứu. Tên so sánh không phải là trường hợp nhạy cảm.

Tài liệu


11
  1. Xác định vị trí tệp tại /etc/mysql/my.cnf

  2. Chỉnh sửa tệp bằng cách thêm các dòng sau:

    [mysqld]

    lower_case_table_names=1

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

  4. chạy mysqladmin -u root -p variables | grep tableđể kiểm tra xem lower_case_table_names1hiện nay

Bạn có thể cần phải tạo lại các bảng này để làm cho nó hoạt động

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.