2012-02-25 30 views
6

Vấn đề là chúng tôi đang làm việc trên máy tính Windows và sau khi thực hiện chúng tôi triển khai mã trên máy Unix. Mã hoạt động tốt trên các cửa sổ nhưng sau đó trong unix chúng tôi nhận được lỗi như 'không có bảng như vậy tồn tại' sau khi thay đổi tên bảng trong trường hợp chính xác nó hoạt động tốt trong unix quá. Trên thực tế, trong các cửa sổ không có tên bảng nhạy cảm theo mặc định nhưng trong unix chúng có (đọc các bảng MySQL thực sự là các tệp và trong Unix chúng ta có tên tệp phân biệt chữ hoa chữ thường nhưng không có trong cửa sổ). Cách giải quyết có thể là tạo lại tất cả các bảng và cho phép có tên bảng theo chữ thường. Có, chúng tôi có thể làm điều đó quá, đó là tốt.Làm cách nào để thực thi tên bảng và cột nhạy cảm trong MySql?

Tuy nhiên, chúng ta vẫn có thể áp đặt độ nhạy trường hợp lên các tên bảng trong MySql (máy Windows). Nếu có, xin vui lòng cho tôi biết làm thế nào để làm điều đó.

+0

đây là một câu hỏi thú vị. Gây rắc rối như SQL của bạn làm việc trong Windows và không phải trong hệ thống dựa trên Unix. AFAIK, không có giải pháp nào ngoài nó. – Nishant

Trả lời

4

Trên Unix, giá trị mặc định là lower_case_table_names là 0. Trên Windows, giá trị mặc định là 1. Trên Mac OS X, mặc định là 1 trước MySQL 4.0.18 và 2 là 4.0.18.

Để khắc phục điều này, bạn có thể tìm cài đặt: lower_case_table_names trong tệp my.ini của bạn, được tìm thấy trong hoặc xung quanh: C: \ Program Files \ MySQL \ MySQL Server 4.1, tùy thuộc vào phiên bản bạn đang chạy. Nếu bạn không tìm thấy các thiết lập, bạn chỉ có thể thêm nó vào cuối của tập tin my.ini, như tôi đã làm, như vậy:

lower_case_table_names=0 

Hãy nhớ khởi động lại dịch vụ MySQL trước khi bạn kiểm tra hay không nó hoạt động.

Nếu bạn đang sử dụng MySQL chỉ trên một nền tảng, bạn thường không phải thay đổi biến lower_case_table_names từ giá trị mặc định của nó. Tuy nhiên, bạn có thể gặp khó khăn nếu bạn muốn chuyển các bảng giữa các nền tảng khác với độ nhạy của hệ thống tệp. Ví dụ, trên Unix, bạn có thể có hai bảng khác nhau có tên my_table và MY_TABLE, nhưng trên Windows những tên đó được coi là giống nhau. Để tránh các vấn đề chuyển dữ liệu phát sinh từ thư của cơ sở dữ liệu hoặc tên bảng, bạn có hai tùy chọn:

Sử dụng lower_case_table_names = 1 trên tất cả các hệ thống. Những bất lợi chính với điều này là khi bạn sử dụng SHOW TABLES hoặc SHOW DATABASES, bạn không thấy tên trong chữ cái gốc của họ.

Sử dụng lower_case_table_names = 0 trên Unix và lower_case_table_names = 2 trên Windows. Điều này bảo tồn thư của cơ sở dữ liệu và tên bảng. Điểm bất lợi của điều này là bạn phải đảm bảo rằng các câu lệnh của bạn luôn luôn tham chiếu đến cơ sở dữ liệu và tên bảng của bạn với chữ cái chính xác trên Windows. Nếu bạn chuyển câu lệnh của mình sang Unix, trong đó chữ cái là quan trọng, chúng không hoạt động nếu chữ cái không chính xác.

Ngoại lệ: Nếu bạn đang sử dụng các bảng InnoDB và bạn đang cố gắng tránh những vấn đề chuyển dữ liệu này, bạn nên đặt lower_case_table_names thành 1 trên tất cả các nền tảng để buộc tên được chuyển thành chữ thường.

Nếu bạn định đặt biến hệ thống lower_case_table_names thành 1 trên Unix, trước tiên bạn phải chuyển đổi cơ sở dữ liệu cũ và tên bảng thành chữ thường trước khi dừng mysqld và khởi động lại bằng cài đặt biến mới.

Hãy kiểm tra các trang web của MySQL để biết thêm thông tin về vấn đề này, và một số cảnh báo quan trọng http://dev.mysql.com/doc/refman/4.1/en/identifier-case-sensitivity.html

5

Các thiết lập được gọi là lower_case_table_names. Nếu bạn đặt nó thành 0, các so sánh sẽ phân biệt chữ hoa chữ thường.

Tuy nhiên,

Bạn không nên đặt biến này là 0 nếu bạn đang chạy MySQL trên một hệ thống có tên file case-insensitive (chẳng hạn như Windows hay Mac OS X). Nếu bạn buộc biến này thành 0 với --lower-case-table-names = 0 trên hệ thống tệp phân biệt chữ hoa chữ thường và truy cập vào tablenames MyISAM bằng cách sử dụng các chữ cái khác nhau, tham số chỉ mục có thể xảy ra.

làm cho tất cả các tên bảng thường xuyên trên tất cả các hệ thống (kể cả Linux), tức là. đặt nó vào một giá trị của 1, âm thanh giống như lựa chọn tốt hơn:

tên Bảng được lưu trữ trong chữ thường trên so sánh đĩa và tên không được trường hợp nhạy cảm. MySQL chuyển đổi tất cả các tên bảng thành chữ thường trên lưu trữ và tra cứu. Hành vi này cũng áp dụng cho tên cơ sở dữ liệu và bí danh bảng.

+0

Vấn đề là tôi có thể thay đổi thiết lập trong cửa sổ máy nhưng không có trong hệ thống Unix. Bởi giải pháp này nếu tôi có quyền truy cập vào tập tin my.ini trong unix tôi có thể thay đổi cài đặt này thành 1 và nó sẽ giải quyết vấn đề. Nhưng tôi muốn theo cách khác. Có nghĩa là thay vì làm cho bảng trong unix trường hợp-insensitive tôi muốn có bảng trong cửa sổ trường hợp nhạy cảm. –

+0

@Rakesh xem tùy chọn '0', nhưng không được khuyến nghị. Mặc dù vậy, tôi không thấy vấn đề này xảy ra như thế nào - bạn có thể chắc chắn rằng mã của bạn đang sử dụng đúng tên không? Tên bảng có bị thay đổi tại một thời điểm nào đó khi triển khai lên Linux không? –

Các vấn đề liên quan