[mysql] # 1071-지정된 키가 너무 깁니다. 최대 키 길이는 767 바이트입니다.

다음 명령을 실행할 때 :

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

이 오류 메시지가 나타납니다.

#1071 - Specified key was too long; max key length is 767 bytes

column1 및 column2에 대한 정보 :

column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci

varchar(20)21 바이트 varchar(500)만 필요하고 501 바이트 만 필요 하다고 생각 합니다. 따라서 총 바이트 수는 522보다 적으며 767보다 작습니다. 왜 오류 메시지가 표시됩니까?

#1071 - Specified key was too long; max key length is 767 bytes



답변

767 바이트는 MySQL 버전 5.6 (및 이전 버전)에서 InnoDB 테이블에 대해 명시된 접두사 제한 입니다. MyISAM 테이블의 길이는 1,000 바이트입니다. MySQL 버전 5.7 이상에서는이 제한이 3072 바이트로 증가했습니다.

또한 utf8mb4로 인코딩 된 큰 char 또는 varchar 필드에 인덱스를 설정하면 767 바이트 (또는 3072 바이트)의 최대 인덱스 접두사 길이를 4로 나누어 191이되어야합니다. utf8mb4 문자의 최대 길이는 4 바이트입니다. utf8 문자의 경우 최대 바이트 접두사 길이는 254가되는 3 바이트입니다.

한 가지 옵션은 VARCHAR 필드에 하한을 두는 것입니다.

이 문제에 대한 응답 에 따른 다른 옵션 은 전체 금액이 아닌 열의 하위 집합을 얻는 것입니다.

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

키를 적용 할 필요가 있으면 조정하지만,이 엔터티와 관련된 데이터 모델을 검토하여 MySQL 제한에 맞지 않고 의도 한 비즈니스 규칙을 구현할 수있는 개선 사항이 있는지 알아볼 가치가 있는지 궁금합니다.


답변

INNODB / Utf-8에 문제가 발생 UNIQUE하여 VARCHAR(256)필드에 색인 을 넣으려고하면로 전환하십시오 VARCHAR(255). 255가 한계 인 것 같습니다.


답변

당신이 한계에 도달했을 때. 다음을 설정하십시오.

  • 이노 DB utf8 VARCHAR(255)
  • 이노 DB utf8mb4 VARCHAR(191)

답변

MySQL은 문자열에서 문자 당 바이트 수에 대해 최악의 경우를 가정합니다. MySQL ‘utf8’인코딩의 경우 문자 당 3 바이트입니다. 해당 인코딩은을 (를) 초과하는 문자를 허용하지 않기 때문입니다 U+FFFF. MySQL ‘utf8mb4’인코딩의 경우, 문자 당 4 바이트입니다. 이는 MySQL이 실제 UTF-8을 호출하기 때문입니다.

따라서 ‘utf8’을 사용한다고 가정하면 첫 번째 열에는 60 바이트의 인덱스가 있고 두 번째 열에는 1500 바이트가 필요합니다.


답변

이 쿼리를 쿼리 전에 실행하십시오.

SET @@global.innodb_large_prefix = 1;

이로 제한이 증가합니다 3072 bytes.


답변

라 라벨 프레임 워크 솔루션

당으로 Laravel 5.4 * 문서. ; 다음과 같이 파일 의 boot메소드 내에서 기본 문자열 길이를 설정해야 app/Providers/AppServiceProvider.php합니다.

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

이 수정에 대한 설명은 Laravel 5.4. * 설명서에서 제공합니다 .

라 라벨은 utf8mb4기본적으로 문자 세트를 사용하는데 , 여기에는 데이터베이스에 “이모 지”를 저장하는 기능이 포함됩니다. 5.7.7 릴리스 이전의 MySQL 버전 또는 10.2.2 릴리스 이전의 MariaDB를 실행중인 경우, MySQL이 인덱스를 작성하기 위해 마이그레이션에서 생성 된 기본 문자열 길이를 수동으로 구성해야 할 수도 있습니다. 에서 Schema::defaultStringLength메소드 를 호출하여이를 구성 할 수 있습니다 AppServiceProvider.

또는 innodb_large_prefix데이터베이스에 대한 옵션을 활성화 할 수 있습니다. 이 옵션을 올바르게 활성화하는 방법에 대한 지침은 데이터베이스 설명서를 참조하십시오.


답변

어떤 문자 인코딩을 사용하고 있습니까? UTF-16과 같은 일부 문자 집합은 문자 당 하나 이상의 바이트를 사용합니다.