Không thể tạo chỉ mục vì độ dài của chỉ mục vượt quá giới hạn trên. Lỗi sau đã được báo cáo
[ERROR] 1071 - Khóa được chỉ định quá dài;
Sự cố này có thể xảy ra trong MySQL-8. 0. 20. 5
Phân tích lỗi
Công cụ bảng InnoDB có giới hạn độ dài đối với tiền tố chỉ mục
Theo mặc định, tiền tố chỉ mục có thể chứa tối đa 767 byte, nhưng nếu innodb_large_prefix được đặt thành BẬT, độ dài tiền tố chỉ mục sẽ tăng lên 3.072 byte
SHOW VARIABLES LIKE '%innodb_large_prefix%';
Độ dài của tiền tố chỉ mục cũng phụ thuộc vào kích thước trang InnoDB. Nếu tham số innodb_page_size được đặt thành giá trị mặc định là 16 KB, thì độ dài tiền tố chỉ mục tối đa là 3.072 byte, nhưng nếu tham số này được đặt thành 8 KB, thì độ dài tiền tố chỉ mục tối đa là 1.536 byte. Nếu tham số này được đặt thành 4 KB, độ dài tối đa của tiền tố chỉ mục là 768 byte
SHOW VARIABLES LIKE '%innodb_page_size%';
Kiểm tra cấu trúc của bảng vấn đề và truy vấn tất cả các bộ ký tự được hỗ trợ và mức sử dụng byte của chúng
SHOW CHARACTER SET;
Khi bảng vấn đề sử dụng bộ ký tự utf8mb4, mỗi ký tự chiếm 4 byte. Điều này có nghĩa là tiền tố chỉ mục chỉ chứa 768 [3072/4 = 768] ký tự nếu tiền tố chỉ mục có 3072 byte. Do đó, bạn chỉ cần đặt độ dài tiền tố chỉ mục trong câu lệnh CREATE TABLE thành 768 hoặc sửa đổi trường chỉ mục để giữ cho nó nhỏ hơn 3072 byte
Từ MySQL5. 6 và MariaDB 10. 2. 2 Định dạng tệp InnoDB mặc định là Barracudar. Barracudar là loại tệp mới hơn, hỗ trợ nhiều loại định dạng mới [ĐỘNG và NÉN]. Nhưng trong phiên bản cũ hơn của MySQL hoặc MariaDB Định dạng tệp InnoDB mặc định vẫn là Antelope. Vì vậy, nếu bạn muốn nhập cơ sở dữ liệu bằng Barracudar [xuất từ phiên bản mới hơn], bạn cũng cần thay đổi định dạng tệp hiện tại thành Barracudar
Đã xảy ra lỗi sau khi chạy tập lệnh tạo tài nguyên cơ sở dữ liệu MySQL để tạo cơ sở dữ liệu XCOMTRST
mysql> tạo bảng XCOM_TRUSTED_SYS [
-> SYSTEM_NAME VARCHAR[255] NOT NULL,
-> IS_SYSNAME_ENERED CHAR[1],
-> GHI CHÚ VARCHAR[255],
-> TÊN HỆ THỐNG CHAR[8] NOT NULL,
-> SYSID CHAR[4] NOT NULL,
-> GROUP_NAME VARCHAR[255] NOT NULL,
-> USER_NAME VARCHAR[255] NOT NULL,
-> USER_PASSWORD VARCHAR[126],
-> USER_DOMAIN VARCHAR[15],
-> khóa chính [SYSNAME,SYSID,SYSTEM_NAME,GROUP_NAME,USER_NAME]];
LỖI 1071 [42000]. Khóa được chỉ định quá dài;
Độ dài tối đa của trường được lập chỉ mục mà công cụ lưu trữ InnoDB có thể sử dụng là 767 byte. Nếu bạn tạo chỉ mục trên trường nhiều byte hoặc nhiều trường thì có thể báo lỗi này
Lưu ý Ví dụ: bộ ký tự bốn byte utf8mb4 được sử dụng. Độ dài mặc định của trường được lập chỉ mục cho phép bởi bộ ký tự utf8mb4 là 191 ký tự dựa trên công thức sau. 767 byte/4 byte cho mỗi ký tự ≈ 191 ký tự. Nếu bạn tạo chỉ mục cho trường thuộc loại varchar [255] hoặc char [255], việc tạo chỉ mục không thành công. Để biết thêm thông tin, hãy xem tài liệu về MySQL tại trang web chính thức của MySQL
Các giải pháp
Sau khi bạn thay đổi giá trị của innodb_large_prefix thành BẬT, độ dài tối đa của trường được lập chỉ mục mà InnoDB có thể sử dụng ở định dạng hàng NĂNG ĐỘNG hoặc NÉN tăng lên 3.072 byte
Lưu ý innodb_large_prefix đã bị xóa khỏi MySQL 8. 0. Nếu phiên bản RDS của bạn chạy MySQL 8. 0, bạn có thể thay đổi giá trị của Row_format cho bảng. Để biết thêm thông tin, xem Bước 3