programing

이 경우 MySQL 오류 1071(키가 너무 깁니다)의 원인은 무엇입니까?

lastcode 2023. 10. 19. 22:20
반응형

이 경우 MySQL 오류 1071(키가 너무 깁니다)의 원인은 무엇입니까?

나는 다음 표를 인코딩했습니다.utf8mb4:

CREATE TABLE IF NOT EXISTS `account` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `customer_id` INT UNSIGNED NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `username` VARCHAR(254) NOT NULL,
  `password` CHAR(60) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_table1_customer_idx` (`customer_id` ASC),
  UNIQUE INDEX `unique_account` (`customer_id` ASC, `username` ASC),
  CONSTRAINT `fk_table1_customer`
    FOREIGN KEY (`customer_id`)
    REFERENCES `customer` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
ROW_FORMAT = DYNAMIC;

여기에 부울 열을 추가해야 하므로 다음 작업을 수행합니다.

ALTER TABLE `account` 
    ADD COLUMN `is_customer_admin`
        INT(4) NOT NULL DEFAULT 0
        AFTER `customer_id`;

나는 또한 구체적으로 a를 추가하려고 했습니다.BOOLEAN대신 열INT(4)

그러나 오류가 발생합니다.

오류 1071 (42000):지정한 키가 너무 깁니다. 최대 키 길이는 767바이트입니다.

그런 오류는 처음입니다.저는 그 구체적인 오류에 대해 몇 가지 질문을 발견했지만, 제 상황에 직접 적용할 수는 없었습니다.

이 질문을 통해 나는 이해합니다.username시간이 너무 길 수도 있지만, 애당초 어떻게 그 테이블을 만들었는지 이해가 안 되네요.내 쿼리는 해당 필드에 닿지 않습니다.

이전 MySQL/MariaDB 버전에서는 최대 키(인덱스) 길이가 767바이트만 허용됩니다.문서:

기본적으로 인덱스 키 접두사 길이 제한은 767바이트입니다.예를 들어 TEXT 또는 VARCHAR 열에 255자 이상의 열 접두사 인덱스를 사용하여 utf8mb3 문자 집합과 각 문자에 대해 최대 3바이트를 가정할 수 있습니다.innodb_large_prefix 구성 옵션을 활성화하면 Dynamic 또는 COMPRESS 행 형식을 사용하는 InnoDB 테이블의 인덱스 키 접두사 길이 제한이 3072바이트로 증가합니다.

이제, 당신의 경우 문제는 당신이 사용하고 있는 것처럼 더욱 증가합니다.utf8mb4대신 문자 집합.이는 문자당 4바이트(3바이트가 아님)를 의미합니다.

`username` VARCHAR(254)

이것은 다음을 의미할 것입니다.254 * 4 = 1016바이트, 확실히 한계를 넘어서고 있습니다.지정된 최대 문자 수를 줄여야 합니다.username기둥.

또한, 다음 제약 조건은 다음과 같이 크게 의미가 없습니다.customer_id이미 Primary 키입니다.

UNIQUE INDEX `unique_account` (`customer_id` ASC, `username` ASC)

그것도 없앨 수 있습니다.

언급URL : https://stackoverflow.com/questions/53326521/what-is-causing-mysql-error-1071-key-too-long-in-this-case

반응형