2009-07-23 25 views
24

Tôi gặp sự cố khi máy chủ sản xuất của mình chạy Unix và máy chủ dev của tôi chạy MS Windows. Vấn đề là Windows không phân biệt chữ hoa chữ thường và Unix. Vì vậy, bảng của tôi đặt trên máy chủ sản xuất sử dụng tên bảng chữ hoa nghĩa là "Khách hàng" và trên Windows, tên bảng nằm trong "khách hàng" thường.Tên bảng chữ thường MySQL trong Windows Tên hoa trên Unix

Tất cả điều này là tốt cho đến khi bạn cần lấy dữ liệu từ hộp này sang hộp khác và xuất SQL của bạn cho biết chèn vào "khách hàng" ở dạng chữ thường và ưu tiên "Khách hàng bảng không xác định". Bởi vì các máy chủ sản xuất hiện đang trên một kế hoạch lưu trữ được chia sẻ tôi không thể thay đổi các thiết lập và cài đặt chìa khóa bỏ qua trường hợp.

Vì vậy, câu hỏi của tôi, là có một cách để có được Windows để chuyển đổi các bảng lại với trường hợp đúng hay là có một số thiết lập tôi có thể bao gồm trong các tập tin SQL xuất khẩu để tôi có thể upload dữ liệu mà không vấn đề này.

Cảm ơn

CẬP NHẬT

Đây là những gì tôi phát hiện ra cho bất cứ ai có vấn đề này.

Nếu bạn đã thiết lập các bảng chạy MySQL trên Windows, hãy thêm lower_case_table_names = 2 vào tệp my.cnf hoặc my.ini của bạn sẽ không tự động thay đổi các bảng của bạn ngay cả khi chúng được tạo bằng chữ hoa hoặc hỗn hợp tên trường hợp.

CREATE TABLE "MyTable" sẽ tạo ra một bảng mới "mytable" không "MyTable" ngay cả khi lower_case_table_names = 2 được đặt trong file my.cnf của bạn.

Để khắc phục vấn đề này sử dụng phương pháp này

  1. Tạo một bản sao của bảng ban đầu của bạn
  2. Thả bảng ban đầu của bạn
  3. Rename copy bảng của bạn bằng cách sử dụng đúng trường hợp.

Đây là cách duy nhất nó hoạt động. Hy vọng điều này sẽ giúp ai đó.

+0

Bạn có tùy chọn thay đổi phiên bản phát triển MySql để phân biệt chữ hoa chữ thường không? –

+0

vì nó chạy trên Windows, không. Tài liệu này giải thích vấn đề nhưng không có giải pháp cho vấn đề của tôi. Những gì tôi thường phải làm là chỉ cần làm một số lượng lớn tìm và thay thế trong tập tin SQL để thay đổi trường hợp tên bảng. http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html – gus

Trả lời

-1

Triết lý hướng dẫn chung của Windows đối với trường hợp là "không phân biệt chữ hoa chữ thường, trường hợp được lưu trữ". Điều đó có nghĩa là Windows không bao giờ có ý định loại bỏ trường hợp của bạn, do đó, có một chút bí ẩn tại sao bảng của bạn trên Windows là trường hợp thấp hơn.

Xin lỗi nếu đây là câu hỏi ngớ ngẩn, nhưng bạn đã thử đổi tên các bảng trên máy Windows sao cho chúng có mẫu chữ hoa đúng?

+0

Có, tôi có nhưng theo tài liệu này http://dev.mysql.com/doc/refman/5.0 /en/identifier-case-sensitivity.html nó sẽ không hoạt động. – gus

+0

Tôi không thấy bất cứ điều gì trong tài liệu đó ngụ ý điều đó. Bạn đang giải thích bằng cách nào? – chaos

21

Taken từ dev.mysql.com:

Để tránh các vấn đề truyền dữ liệu phát sinh từ lettercase của cơ sở dữ liệu hoặc bảng tên, bạn có hai lựa chọn:

  • Sử dụng lower_case_table_names = 1 trên tất cả các hệ thống này. 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.

+6

Tôi không nghĩ rằng bạn thực sự phải thay đổi bất cứ điều gì trên hộp Unix để sử dụng bộ tư vấn thứ hai, bởi vì 'lower_case_table_names' là 0 theo mặc định. – chaos

+0

Ồ và +1; Tôi không chắc chắn câu trả lời của tôi * sẽ không * sửa chữa nó, nhưng tôi khá chắc chắn điều này * sẽ *. – chaos

+0

... tôi không có ý xúc phạm bằng cách đăng nội dung từ dev.mysql ... tôi đã không nhận thức được tùy chọn mysql này và tôi gần như hoàn toàn là một nhà phát triển cơ sở dữ liệu. – codemonkey

0

Có một giải pháp dễ dàng:

Luôn đặt tên chữ thường là tablenames của bạn.

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