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(安全でない文がバイナリログに書き込まれた)
- 3140ER_INVALID_JSON_TEXT: Invalid JSON text(無効な JSON テキスト)
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value(値に対応するパーティションがない)
- 1049Unknown database 'name'(不明なデータベース 'name')