Docker mysql Lower_case_table_names

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 (và có thể nhiều hơn, tùy thuộc vào công cụ lưu trữ). Kích hoạt cũng tương ứng với các tập tin. Do đó, phân biệt chữ hoa chữ thường của hệ điều hành cơ bản đóng một phần trong phân biệt chữ hoa chữ thường của tên cơ sở dữ liệu, bảng và trình kích hoạt. Điều này có nghĩa là những tên như vậy không phân biệt chữ hoa chữ thường trong Windows, nhưng phân biệt chữ hoa chữ thường trong hầu hết các loại Unix. Một ngoại lệ đáng chú ý là macOS, dựa trên Unix nhưng sử dụng loại hệ thống tệp mặc định (HFS+) không phân biệt chữ hoa chữ thường. Tuy nhiên, macOS cũng hỗ trợ các ổ đĩa UFS, phân biệt chữ hoa chữ thường giống như trên mọi Unix. Xem Phần 1. 7. 1, “Phần mở rộng MySQL cho SQL chuẩn”. Biến hệ thống

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
1 cũng ảnh hưởng đến cách máy chủ xử lý độ nhạy trường hợp của mã định danh, như được mô tả sau trong phần này

Ghi chú

Mặc dù tên cơ sở dữ liệu, bảng và trình kích hoạt không phân biệt chữ hoa chữ thường trên một số nền tảng, nhưng bạn không nên đề cập đến một trong những tên này bằng cách sử dụng các trường hợp khác nhau trong cùng một câu lệnh. Câu lệnh sau đây sẽ không hoạt động vì nó vừa đề cập đến một bảng là

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
2 vừa là
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
3

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Tên phân vùng, phân vùng con, cột, chỉ mục, thói quen được lưu trữ, sự kiện và nhóm tài nguyên không phân biệt chữ hoa chữ thường trên bất kỳ nền tảng nào, cũng như bí danh cột

Tuy nhiên, tên của các nhóm logfile phân biệt chữ hoa chữ thường. Điều này khác với SQL tiêu chuẩn

Theo mặc định, bí danh bảng phân biệt chữ hoa chữ thường trên Unix, nhưng không phải như vậy trên Windows hoặc macOS. Câu lệnh sau đây sẽ không hoạt động trên Unix, vì nó đề cập đến bí danh là

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
4 và là
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
5

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;

Tuy nhiên, tuyên bố tương tự này được cho phép trên Windows. Để tránh các vấn đề gây ra bởi sự khác biệt như vậy, tốt nhất là áp dụng một quy ước nhất quán, chẳng hạn như luôn tạo và tham chiếu đến cơ sở dữ liệu và bảng bằng cách sử dụng tên chữ thường. Quy ước này được khuyến nghị để có tính di động tối đa và dễ sử dụng

Cách tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa và được sử dụng trong MySQL bị ảnh hưởng bởi biến hệ thống

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
1.
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
1 có thể lấy các giá trị được hiển thị trong bảng sau. Biến này không ảnh hưởng đến độ phân biệt chữ hoa chữ thường của số nhận dạng trình kích hoạt. Trên Unix, giá trị mặc định của
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
1 là 0. Trên Windows, giá trị mặc định là 1. Trên macOS, giá trị mặc định là 2.

Chỉ có thể cấu hình

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
1 khi khởi tạo máy chủ. Việc thay đổi cài đặt
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
1 sau khi khởi tạo máy chủ bị cấm

ValueMeaning_______12Tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa bằng cách sử dụng chữ cái được chỉ định trong câu lệnh
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
3 hoặc
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
4. So sánh tên có phân biệt chữ hoa chữ thường. Bạn nên not đặt biến này thành 0 nếu bạn đang chạy MySQL trên hệ thống có tên tệp không phân biệt chữ hoa chữ thường (chẳng hạn như Windows hoặc macOS). Nếu bạn buộc biến này thành 0 với
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
5 trên hệ thống tệp phân biệt chữ hoa chữ thường và truy cập tên bảng
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
6 bằng cách sử dụng các chữ cái khác nhau, thì có thể dẫn đến hỏng chỉ mục.
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
7Tê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. MySQL chuyển đổi tất cả các tên bảng thành chữ thường khi 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.
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
8Tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa bằng cách sử dụng chữ cái được chỉ định trong câu lệnh
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
3 hoặc
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
4, nhưng MySQL chuyển đổi chúng thành chữ thường khi tra cứu. So sánh tên không phân biệt chữ hoa chữ thường. Tính năng này chỉtrên các hệ thống tệp không phân biệt chữ hoa chữ thường. Tên bảng
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
11 và tên dạng xem được lưu ở dạng chữ thường, như đối với
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
12

Nếu bạn chỉ sử dụng MySQL trên một nền tảng, thông thường bạn không phải sử dụng cài đặt

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
1 ngoài cài đặt mặc định. Tuy nhiên, bạn có thể gặp khó khăn nếu muốn chuyển bảng giữa các nền tảng khác nhau về phân biệt chữ hoa chữ thường của hệ thống tệp. Ví dụ: trên Unix, bạn có thể có hai bảng tên khác nhau là
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
2 và
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
3, nhưng trên Windows hai tên này được coi là giống hệt nhau. Để tránh các sự cố truyền dữ liệu phát sinh từ chữ cái của cơ sở dữ liệu hoặc tên bảng, bạn có hai tùy chọn

  • Sử dụng

    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    12 trên tất cả các hệ thống. Nhược điểm chính của điều này là khi bạn sử dụng
    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    17 hoặc
    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    18, bạn sẽ không nhìn thấy tên trong hộp thư gốc của chúng

  • Sử dụng

    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    19 trên Unix và
    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    20 trên Windows. Điều này bảo tồn chữ cái của cơ sở dữ liệu và tên bảng. Điều 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 đề cập đến tên bảng và cơ sở dữ liệu của bạn với ký tự chính xác trên Windows. Nếu bạn chuyển các câu lệnh của mình sang Unix, trong đó chữ hoa là quan trọng, chúng sẽ không hoạt động nếu chữ hoa không chính xác

    Ngoại lệ . Nếu bạn đang sử dụng bảng

    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    11 và đang cố gắng tránh các sự cố truyền dữ liệu này, bạn nên sử dụng
    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    12 trên tất cả các nền tảng để buộc tên phải được chuyển đổi thành chữ thường.

Tên đối tượng có thể được coi là trùng lặp nếu dạng chữ hoa của chúng bằng nhau theo đối chiếu nhị phân. Điều đó đúng với tên của con trỏ, điều kiện, thủ tục, hàm, điểm lưu trữ, tham số thủ tục được lưu trữ, biến cục bộ của chương trình được lưu trữ và plugin. Nó không đúng với tên cột, ràng buộc, cơ sở dữ liệu, phân vùng, câu lệnh được chuẩn bị bằng

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
23, bảng, trình kích hoạt, người dùng và biến do người dùng xác định

Phân biệt chữ hoa chữ thường của hệ thống tệp có thể ảnh hưởng đến các tìm kiếm trong các cột chuỗi của bảng

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
24. Để biết thêm thông tin, hãy xem Phần 10. 8. 7, “Sử dụng Đối chiếu trong Tìm kiếm INFORMATION_SCHEMA”