써먹는 웹개발

[Mysql] 테이블 생성시 'ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes' 문구가 떴을 때 해결방법 본문

웹개발/Database

[Mysql] 테이블 생성시 'ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes' 문구가 떴을 때 해결방법

kmhan 2019. 12. 30. 17:19


728x90
반응형

테이블 생성시 'ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes' 문구가 떴을 때 해결방법입니다.

 

원인 : index를 만들때 varchar(255)로 잡아서 발생하는 문제

 

문제의 create query

CREATE TABLE `test` (
 `srl` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
 `test` varchar(255) NOT NULL COMMENT 'test',
 `code` varchar(255) NOT NULL COMMENT `code`,
  PRIMARY KEY (`srl`),
  UNIQUE KEY `test_unique` (`test`),
  KEY `code_index` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';
result : ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

 

첫번째 해결방법 : (인덱스가 허용 가능하도록) 키 사이즈를 줄인다.

CREATE TABLE `test` (
 `srl` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
 `test` varchar(255) NOT NULL COMMENT 'test',
 `code` varchar(255) NOT NULL COMMENT `code`,
  PRIMARY KEY (`srl`),
  UNIQUE KEY `test_unique` (`test`(100)),
  KEY `code_index` (`code`(100))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';

 

제약사항은 byte로 처리되므로, 문자형 컬럼의 경우 character set에 따라 허용하는 글자의 수가 달라짐을 이해해야 한다.
euckr이라면 2byte, utf8이라면 3byte, utf8mb4라면 4byte로 계산해야 한다.

두번째 해결방법 : 파일 포맷 변경 및 시스템 변수 설정값을 바꾼다.
(포맷 형식을 파쿠다 포맷으로 변경후에 다시 테이블 생성)
innodb_file_format_max = Barracuda
innodb_file_format = Barracuda
이렇게 설정하여 시스템 변수를 Barracuda 형태로 생성되도록 하고,
innodb_large_prefix=ON으로 설정한다. 그러면 약 3072byte까지 생성할 수 있다.

출처
1. http://egloos.zum.com/color106/v/3045758
2. https://mysqldba.tistory.com/267

728x90
반응형


Comments