2014-02-13 3 views
4

며칠 전에 데이터베이스를 utf8에서 utf8mb4로 마이그레이션했습니다. 이전 때문에 대부분의 기본 키는 문자 당 추가 바이트로 인해 VARCHAR(255)에서 VARCHAR(191)으로 업데이트되었습니다.MySQL utf8mb4 외래 키 오류

이제 문제는 기존 테이블을 참조하는 새 테이블에 새 FOREIGN 키를 추가 할 수 없다는 것입니다. 우리는 MySQL의 워크 벤치에 다음과 같은 오류가 발생합니다 :

"참조 된 테이블이 table.id에 대한 호환 유형 후보 열이 없습니다 힌트 :. 원본 열은 참조 테이블이 VARCHAR 인의 VARCHAR (191), PK를 입력있다 (191). "

우리는 콘솔을 통해 외래 키를 추가하려고하면 우리가 얻을 : 외래 키 제약 조건에

최신 FOREIGN KEY ERROR

2014년 2월 13일 10시 27분 51초 126bb3000 오류 외래 키 (fk_id) 참조 테이블 (ID) : 참조 된 열 첫 번째 열 또는 열 유형 테이블과 로 표시 참조 된 테이블에 인덱스를 찾을 수 테이블 테이블/#의 SQL-159_2b2의 참조 된 테이블이 일치하지 않음 제약 조건.

그러나보고 된 오류에서 볼 수 있듯이 두 유형 모두 VARCHAR(191)으로 정의됩니다.

무엇이 누락 되었습니까?

답변

3

발견 된 문제와 해결책. utf8mb4를 사용할 때 데이터 정렬 내에서 비교하는 동안 MYSQL에 몇 가지 문제가있는 것으로 보입니다.

MYSQL 서버가 기본 데이터 정렬로 utf8mb4를 사용 중이라고 가정 할 때, 새로운 테이블은 해당 데이터 정렬을 기본값으로 상속받습니다.

새 테이블을 만들려면 A라고 부르 자. 표 A에는 utf8mb4 - 기본 데이터 정렬 (DB 기본값에서 상속)의 데이터 정렬이 있습니다. 표 B의 x 열에 'utf8mb4 - default collation'이 있어야하는 B가 같은 정렬을 갖는 A의 열 p에서 외래 키를 생성하려는 경우 ('utf8mb4 - 기본 조합'이어야 함) 'utf8mb4 - 기본 조합' 열 x에는 utf8mb4_unicode_ci의 데이터 정렬이 있습니다. 질문에서 오류가 발생합니다.

참조 된 테이블에 table.id와 호환되는 유형의 후보 열이 없습니다. 힌트 : 소스 컬럼의 유형은 VARCHAR (191)이며, 참조 된 테이블의 PK는 VARCHAR (191)입니다.

색인이 있고 유형이 동일한 경우 오류는 열 정렬의 불일치 때문에 발생합니다.

ALTER TABLE `database`.`A` CHARACTER SET = utf8mb4 ; 
ALTER TABLE `database`.`A` CHANGE COLUMN `p` `p` VARCHAR(191) CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' NOT NULL 

하고 매력처럼 외부 키 작동 추가 :

ALTER TABLE `database`.`A` 
ADD CONSTRAINT `FKD84ACC0C2200B55` 
FOREIGN KEY (`p`) 
REFERENCES `database`.`B` (`x`) 
ON DELETE CASCADE 
ON UPDATE CASCADE; 
+0

을했다

내가 명시 적으로 참조 된 컬럼과 같은 데이터 정렬을 사용하는 열 페이지를 변경했습니다를 해결하려면 같은 문제.mysql workbench에서 직접 rodrigos 응답을 적용하고, 테이블을 편집하고, 열로 이동하여 원하는 열 (기본값이지만 명시 적으로)에 대한 두 열의 데이터 정렬을 지금 설정해야합니다. 나쁜 벌레 – sasha