Hướng dẫn how to make mysql database case insensitive - làm thế nào để làm cho trường hợp cơ sở dữ liệu mysql không nhạy cảm

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_tableMY_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ả aA:

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.

Giá trịNghĩa
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
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
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 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
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 không nhạy cảm trường hợp và truy cập các 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, 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
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
5 on a case-insensitive file system and access
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
6 tablenames using different lettercases, index corruption may result.
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
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.
mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
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
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 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_names1 Tên bảng và tên xem được lưu trữ bằng chữ thường, như đối với lower_case_table_names2.only on file systems that are not case-sensitive! lower_case_table_names1 table names and view names are stored in lowercase, as for lower_case_table_names2.

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_tableMY_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_names2 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ụng lower_case_table_names7 hoặc lower_case_table_names8, bạn không thấy tên trong Lettercase ban đầu của họ.

  • Sử dụng lower_case_table_names9 trên Unix và my_table0 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_names1 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ụng lower_case_table_names2 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 using lower_case_table_names1 tables and you are trying to avoid these data transfer problems, you should use lower_case_table_names2 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_table3, 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_table4. Để 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.

Là trường hợp mysql

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.. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases.

Chúng ta có thể làm cho trường hợp mysql không

Các chức năng chuỗi trong MySQL luôn nhạy cảm trường hợp, vì vậy bạn có thể sử dụng bất kỳ chức năng nào định vị, vị trí hoặc thiết bị., so you could use any of the functions LOCATE , POSITION , or INSTR .