2010-08-08 4 views
2
CREATE TABLE profile_category (
    id mediumint UNSIGNED NOT NULL AUTO_INCREMENT, 
    pc_name char(255) NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY idx_name (name) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

이것은 완전히 utf8 charset 인 테이블의 하나입니다. MySQL은 모든 문자에 대해 3 비트를 예약하기 때문에 문제는 여기에 있습니다. (지금까지는 그것에 대해 전혀 새롭지 않았습니다.) pc_name 열의 인덱스가 3 배 더 커졌습니다. 이 경우 색인은 훨씬 더 많은 공간을 차지합니다.utf8 charset으로 MySQL 테이블 컬럼을 효율적으로 인덱스하는 방법

이 값이 고유해야하기 때문에 짧은 인덱스를 만들 수 없습니다. 솔루션 중 하나는 pc_name char(255) CHARSET latin1 NOT NULL,으로 설정 될 수 있지만 이것이 문제인지 아닌지는 알 수 없습니다. 이것이 좋은 아이디어인가, 아니면 내가 모르는 해결책이 있습니까?

업데이트 : pc_name 열은 유효한 utf8 인 것으로 확인되었습니다. 그리고 그것은 비 서양인을 허용합니다. 그러나이 경우에 나는 단지 거래를 할 수 있으며 그럴만 한 가치가있는 경우에만 /[_A-Za-z]/ 허용합니다.

업데이트 2 : 나는 캐릭터 세트를 latin1에하는 pc_name을 설정하려고했으나 지금은 같은 예외를 얻을 : pc_name가 여기에 옵션을 될 수 없습니다 latin1에 비 서구 텍스트를 포함하는 것입니다 경우 Zend_Db_Statement_Exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

+0

인덱스는 보통 디스크 공간을 절약하기보다는 쿼리 속도를 높이는 데 사용됩니다. –

+0

"필요한 여분의 인덱스는 테이블 자체의 크기가 작을지라도 테이블의 전체 크기에 상당히 추가 할 수 있습니다. 특히 기본 키가 크고 외래 키 검사 이외의 다른 용도로는 쓸모가 없다면 입니다." – Ernest

답변

0

을 - 그렇지 않으면, 그것을 위해 가라.

하드 코어 MySQL이 아닌, InnoDB와 MySQL 테이블을 혼합하는 데 문제가 있는지 잘 모릅니다. 그렇지 않다면이 테이블을 표준 MySQL 테이블로 만들고 utf8로 남겨 둘 수 있습니까?

+0

답변 해 주셔서 감사합니다. 나는 내 질문을 업데이트 할 것이다. – Ernest

+0

InnoDB의 경우 외래 키로 다른 테이블 profile.id 열이 있습니다. 그래서 나는 그곳에 머물고 싶다. 데이터 엔진이 언급 된 문제를 변경하는지 확실하지 않습니다. – Ernest

관련 문제