1170: ER_BLOB_KEY_WITHOUT_LENGTH: BLOB/TEXT column used in key specification without a key length (키 길이 없이 BLOB/TEXT 컬럼을 키에 사용함)
MySQL의미
인덱스/키 정의에 접두사 길이를 지정하지 않고 BLOB 또는 TEXT 컬럼을 사용했다. 이 타입은 전체를 인덱싱할 수 없으며 처음 N개 문자/바이트만 인덱싱할 수 있다.
원인
CREATE TABLE 또는 CREATE INDEX에서 길이 없이 TEXT/BLOB 컬럼에 INDEX/UNIQUE/PRIMARY KEY를 정의한 경우다. MySQL은 잠재적으로 매우 큰 이 값들을 전체 인덱싱할 수 없으므로 접두사 길이를 요구한다.
해결 방법
인덱스에 접두사 길이를 지정한다(예: INDEX (description(255))). 예: ALTER TABLE my_table ADD INDEX idx_description (description(191)); (InnoDB 키 접두사 한도 때문에 utf8mb4에서는 191을 흔히 사용한다). 전문 검색이 필요하면 FULLTEXT 인덱스를 고려한다. 짧고 고유해야 하는 필드라면 컬럼을 VARCHAR로 변환하는 것이 더 적합할 수 있다.
같은 데이터베이스의 다른 항목
- 1836ER_READ_ONLY_MODE: Running in read-only mode (읽기 전용 모드로 실행 중)
- 3819ER_CHECK_CONSTRAINT_VIOLATED: Check constraint is violated (CHECK 제약 조건 위반)
- 1118ER_TOO_BIG_ROWSIZE: Row size too large
- 1592ER_BINLOG_UNSAFE_STATEMENT: Unsafe statement written to the binary log (binary log에 안전하지 않은 문장 기록)
- 3140ER_INVALID_JSON_TEXT: Invalid JSON text
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value (해당 값에 대한 파티션 없음)
- 1049Unknown database 'name'