1071 Khóa được chỉ định quá dài MySQL

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

Mã lỗi 1071 trong MySQL là gì?

Sự cố xảy ra do bộ ký tự mặc định trên máy chủ MySQL . Có thể máy chủ MySQL đang sử dụng một số bộ ký tự Unicode, trong đó mỗi ký tự được coi là 4 byte khiến độ dài vượt quá 3072 byte được cơ sở dữ liệu hỗ trợ.

Độ dài khóa tối đa trong MySQL là bao nhiêu?

Tức là, độ dài khóa chỉ mục tối đa là 1536 byte khi kích thước trang là 8KB và 768 byte khi kích thước trang là 4KB . Các giới hạn áp dụng cho các tiền tố khóa chỉ mục cũng áp dụng cho các khóa chỉ mục toàn cột. Tối đa 16 cột được phép cho các chỉ mục nhiều cột. Vượt quá giới hạn trả về một lỗi.

Chủ Đề