9.2.3 & nbsp; độ nhạy của trường hợp định danh
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ữ]. Trình kích hoạt cũng tương ứng với các tập tin. 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, bảng và tên kích hoạt. Điều này có nghĩa là những cái tên như vậy không nhạy cảm với trường hợp trong Windows, nhưng nhạy cảm với trường hợp trong hầu hết các giống 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 nhạy cảm trường hợp. Tuy nhiên, MacOS cũng hỗ trợ khối lượng UFS, có tính nhạy cảm với trường hợp giống như trên bất kỳ Unix nào. Xem Phần & NBSP; 1.7.1, Phần mở rộng MySQL cho SQL tiêu chuẩn. Biến hệ thống lower_case_table_names
cũng ảnh hưởng đến cách máy chủ xử lý độ nhạy của trường hợp định danh, như được mô tả sau trong phần này.
Ghi chú
Mặc dù cơ sở dữ liệu, bảng và tên kích hoạt không nhạy cảm với trường hợp trên một số nền tảng, bạn không nên đề cập đến một trong số 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. Tuyên bố sau đây sẽ không hoạt động vì nó đề cập đến một bảng cả là my_table
và MY_TABLE
:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
Phân vùng, phân vùng, cột, chỉ mục, thường xuyên được lưu trữ, sự kiện và tên nhóm tài nguyên không nhạy cảm với bất kỳ nền tảng nào, cũng không phải là bí danh cột.
Tuy nhiên, tên của các nhóm logfile là nhạy cảm trường hợp. Điều này khác với SQL tiêu chuẩn.
Theo mặc định, các bí danh bảng có tính nhạy cảm với trường hợp trên Unix, nhưng không phải như vậy trên Windows hoặc MacOS. Tuyên bố sau đây sẽ không hoạt động trên Unix, bởi vì nó đề cập đến bí danh cả a
và A
:
mysql> SELECT col_name FROM tbl_name AS a
WHERE a.col_name = 1 OR A.col_name = 2;
Tuy nhiên, câu lệnh 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 luôn tạo và đề cập đến cơ sở dữ liệu và bảng sử dụng tên chữ thường. Công ước này được khuyến nghị cho tính di động tối đa và dễ sử dụng.
Cách các 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 lower_case_table_names
. lower_case_table_names
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 độ nhạy trường hợp của số nhận dạng kích hoạt. Trên Unix, giá trị mặc định của lower_case_table_names
là 0. Trên Windows, giá trị mặc định là 1. Trên macOS, giá trị mặc định là 2.not affect case sensitivity of trigger identifiers. On Unix, the default value of
lower_case_table_names
is 0. On Windows, the default value is 1. On macOS, the default value is 2.
lower_case_table_names
chỉ có thể được cấu hình khi khởi tạo máy chủ. Thay đổi cài đặt lower_case_table_names
sau khi máy chủ được khởi tạo bị cấm.
2 | Tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa bằng cách sử dụng Lettercase được chỉ định trong câu lệnh 3 hoặc 4. So sánh tên là nhạy cảm trường hợp. Bạn không nên đặt biến này thành 0 nếu bạn đang chạy MySQL trên một hệ thống có tên tệp không phân biệt chữ hoa chữ thường [như Windows hoặc MacOS]. Nếu bạn buộc biến này thành 0 với 5 trên hệ thống tệp không nhạy cảm trường hợp và truy cập các tên bảng 6 bằng cách sử dụng các chữ cái khác, tham nhũng có thể dẫn đến.not set this variable to 0 if you are running
MySQL on a system that has case-insensitive file names [such as Windows or macOS]. If you force this variable to 0 with 5 on a case-insensitive file system and access 6 tablenames using different lettercases, index corruption may result.
|
7 | Tên bảng được lưu trữ bằng chữ thường trên đĩa và so sánh tên không nhạy cảm trường hợp. 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. |
8 | Tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa bằng cách sử dụng Lettercase được chỉ định trong câu lệnh 3 hoặc 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 nhạy cảm với trường hợp. Điều này chỉ hoạt động trên các hệ thống tệp không nhạy cảm với trường hợp! lower_case_table_names 1 Tên bảng và tên xem được lưu trữ bằng chữ thường, như đối với lower_case_table_names 2.only on file systems that are not case-sensitive! lower_case_table_names 1 table names and view names are stored in lowercase, as for lower_case_table_names 2.
|
Nếu bạn đang sử dụng MySQL trên một nền tảng, bạn thường không phải sử dụng cài đặt lower_case_table_names
ngoài mặc định. Tuy nhiên, bạn có thể gặp khó khăn nếu bạn muốn chuyển bảng giữa các nền tảng khác nhau về độ nhạy của trường hợp 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, hai tên này được coi là giống hệt nhau. Để tránh các vấn đề truyề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
2 trên tất cả các hệ thống. Nhược điểm chính với điều này là khi bạn sử dụnglower_case_table_names
7 hoặclower_case_table_names
8, bạn không thấy tên trong Lettercase ban đầu của họ.Sử dụng
lower_case_table_names
9 trên Unix vàmy_table
0 trên Windows. Điều này bảo tồn thư của cơ sở dữ liệu và tên bảng. Nhược điểm 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 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ác câu lệnh của mình sang Unix, nơi Lettercase có ý nghĩa, chúng không hoạt động nếu Lettercase không chính xác.Ngoại lệ: Nếu bạn đang sử dụng các bảng
lower_case_table_names
1 và bạn đang cố gắng tránh các vấn đề truyền dữ liệu này, bạn nên sử dụnglower_case_table_names
2 trên tất cả các nền tảng để buộc các tên được chuyển đổi thành chữ thường.: If you are usinglower_case_table_names
1 tables and you are trying to avoid these data transfer problems, you should uselower_case_table_names
2 on all platforms to force names to be converted to lowercase.
Tên đối tượng có thể được coi là trùng lặp nếu các dạng viết hoa của chúng bằng nhau theo một đối chiếu nhị phân.Điều đó đúng với tên của con trỏ, điều kiện, quy trình, chức năng, điểm lưu, các tham số thường xuyên được lưu trữ, các biến cục bộ chương trình được lưu trữ và plugin.Nó không đúng với tên của các cột, ràng buộc, cơ sở dữ liệu, phân vùng, câu lệnh được chuẩn bị với my_table
3, bảng, trình kích hoạt, người dùng và các biến do người dùng xác định.
Độ nhạy của trường hợp 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 my_table
4.Để biết thêm thông tin, xem Phần & NBSP; 10.8.7, Sử dụng đối chiếu trong thông tin_schema tìm kiếm.