복붙노트

[RUBY-ON-RAILS] MySQL의 :: 오류 : 지정된 키가 너무 깁니다; 최대 키 길이는 1000 바이트입니다

RUBY-ON-RAILS

MySQL의 :: 오류 : 지정된 키가 너무 깁니다; 최대 키 길이는 1000 바이트입니다

script/generate acts_as_taggable_on_migration
rake db:migrate

원인

Mysql::Error: Specified key was too long; max key length is 1000 bytes: CREATE  INDEX `index_taggings_on_taggable_id_and_taggable_type_and_context` ON `taggings` (`taggable_id`, `taggable_type`, `context`)

어떻게해야합니까?

여기 내 데이터베이스 인코딩은 다음과 같습니다

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 | 
| character_set_connection | latin1 | 
| character_set_database   | utf8   | 
| character_set_filesystem | binary | 
| character_set_results    | latin1 | 
| character_set_server     | latin1 | 
| character_set_system     | utf8   | 
+--------------------------+--------+
7 rows in set (0.00 sec)

해결법

  1. ==============================

    1.이것은 전적으로 MySQL의 문제입니다 -

    이것은 전적으로 MySQL의 문제입니다 -

    MySQL은 다른 엔진이있다 -의 MyISAM, InnoDB의 메모리를 ...

    MySQL은 당신이 컬럼에 인덱스 (들)을 정의하는 데 사용할 수있는 공간의 크기에 다른 제한이있다 -는 1,000 바이트의의 MyISAM를 들어; 그것은 이노 767입니다. 그리고 그 열 문제의 데이터 유형 - (100 자 3 = 300 * 때문에)는 VARCHAR (100)에 대한 인덱스는 그 바이트 (300)를 취할 것입니다, 그래서 VARCHAR에 대한, 그것은 3 배입니다.

    당신이 천장 값을 명중 일부 색인을 수용하기 위해, 당신은 열 데이터 형식의 부분과 관련하여 인덱스를 정의 할 수 있습니다 :

    CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))
    

    그 your_column 가정하면 VARCHAR (100)만이 제 50 개 문자 것 위의 실시 예에서의 인덱스이다. 50 문자 이상으로 데이터를 검색하면 인덱스를 사용할 수 없습니다.

  2. ==============================

    2.http://bugs.mysql.com/bug.php?id=4541이 여기에보고 된 버그를 것 같다

    http://bugs.mysql.com/bug.php?id=4541이 여기에보고 된 버그를 것 같다

    당신은 모든이 게시물에 답변 여전히 오류가 시도하는 경우에, 당신은 당신의 SQL 쿼리 창에서이 명령을 실행하려고 할 수 있습니다.

    set GLOBAL storage_engine='InnoDb';
    
  3. ==============================

    3.이 오류는 이전처럼 일부 였는지를 발생할 경우가 MySQL을 구성 파일을 변경함으로써 해결 될 수있다 (* .INI)를

    이 오류는 이전처럼 일부 였는지를 발생할 경우가 MySQL을 구성 파일을 변경함으로써 해결 될 수있다 (* .INI)를

    default-storage-engine=InnoDB
    
  4. ==============================

    4.나는 당신의 필드 중 하나가 1000 개 이상의 문자와 VARCHAR 생각합니다. 예를 들면 문맥?

    나는 당신의 필드 중 하나가 1000 개 이상의 문자와 VARCHAR 생각합니다. 예를 들면 문맥?

    인덱스의 의미에 대해 생각해보십시오. 모든 인덱스 필드는 where 절 내에있는 때 행에 빠르게 액세스 할 수 있습니다. 인덱스가 긴 (MySQL의 1000 개 이상의 바이트의 경우) 인 경우는 느린 전체 테이블 스캔과 전체 테이블에 액세스하는 것보다 아마 때문에, 그것은, 인덱스를 사용하는 것이 이해되지 않는다.

    나는 그 두 번 짧은 경우, taggable_id 및 taggable_type에 인덱스, 예컨대을 단축하는 것이 좋습니다 것입니다.

    건배 - 게르하르트

  5. from https://stackoverflow.com/questions/3489041/mysqlerror-specified-key-was-too-long-max-key-length-is-1000-bytes by cc-by-sa and MIT license